将字符串添加到字符串指针

Adding a string to a string pointer

本文关键字:字符串 指针 添加      更新时间:2023-10-16

是否可以在C++中向字符串指针添加字符串?不起作用的示例:

String* temp;
temp[0] = "string";

就像在中一样

String temp[3];
temp[0] = "string";

在建议只使用普通数组或将其复制到其他固定数组之前,需要在函数中返回字符串指针。例如

String* SomeClass::toArray(String str)

我也对如何从这个函数返回数组的其他建议持开放态度。

不确定什么是String这个代码片段

String* temp;
temp[0] = "string";

如果它被编译,则会导致未定义的行为,因为指针temp要么具有不确定的值(如果它是本地变量),要么为NULL,并且您可能无法解除对它的限制。

假设此代码片段

String temp[3];
temp[0] = "string";

是有效的,你可以写例如

String* other_temp = temp;
other_temp[0] = "string";

您不能向POINTER添加任何内容,指针只是指向一些内存。您首先需要有一些实例,比如在第二个实例String temp[3];中,您正在创建三个String实例。

所以String temp;将创建String的本地实例,然后为了获得它的指针,您可以使用String * tempPtr = &temp;,但我不明白您为什么要这样做,因为您可以按原样使用temp……就像temp.clear();String类的任何函数一样(请参阅它的API)。


编辑有关返回字符串指针的信息。

这是一种不幸的C++API设计。那么,谁将拥有那个例子的记忆呢?

例如:

String* SomeClass::toArray(String str) {
    String result;
    // BUG, DO NOT DO THIS!
    return &result; // returns pointer to local stack variable
    // which gets released *here*, invalidating the pointer
}
String* SomeClass::toArray(String str) {
    String *result = new String;
    return result; // returns pointer to global heap
    // now if the upper layer of code will not call "delete" on it
    // you have memory leak
}

顺便说一句,从"toArray"名称来看,您想要的是String实例的数组,而不是String指针。因此,函数应该定义为String[] SomeClass::toArray(String str),在内存所有权方面仍然存在同样的问题。


我要做的是不返回数组。可能是void SomeClass::toArray(const String & str, std::vector<String> & array),将数据填充到array向量中。

我不知道你在arduino上用了多少C++,如果std::vector可以的话,但有一个String类感觉就像vector<>也可以,特别是如果您通过传递String的副本实例而不是引用来浪费堆栈的话。(除非Stringchar[]的某个宏/typedef,请不要告诉我……我的意思是,即使C++也可以用低内存占用的方式编写,如果你避免不必要地分配C++类的临时实例,你就不必到处硬连接数组)。