【问题标题】:Adding a string to a string pointer将字符串添加到字符串指针
【发布时间】:2016-07-28 13:34:27
【问题描述】:

是否可以在 C++ 中将字符串添加到字符串指针? 不工作的例子:

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

就像它可能在:

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

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

String* SomeClass::toArray(String str)

我也愿意接受其他关于如何从该函数返回数组的建议。

【问题讨论】:

  • 我也想问同样的问题。但正如你所见,这个问题有 arduino 标签。 String 是基于 C 或 C++ 的 Arduino 语言对象,但与它们中的任何一个都不完全相同

标签: c++ arrays string arduino


【解决方案1】:

独立于什么是String这个代码sn-p

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

如果它被编译会导致未定义的行为,因为指针 temp 要么有一个不确定的值(如果它是一个局部变量)要么为 NULL,你不能取消它。

前提是这段代码sn-p

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

是有效的,你可以写例如

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

【讨论】:

    【解决方案2】:

    你不能向 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[] SomeClass::toArray(String str),内存所有权仍然存在同样的问题。


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

    我不知道你在 arduino 上使用了多少 C++,std::vector 是否可以,但是有一个 String 类感觉就像 vector 也可以,特别是如果你正在浪费你的堆栈传递 String 的副本实例而不是引用。 (除非Stringchar[] 的一些宏/类型定义,请不要告诉我...如果您避免不必要地分配 C++ 类的临时实例)。

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多