2016-07-28 227 views
-1

是否可以將字符串添加到C++中的字符串指針? 不工作例如:將字符串添加到字符串指針

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

就像它是可能的:

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

建議只使用一個正常的陣列或複製到不同的固定陣列之前,字符串的指針需要退換一個函數。例如。

String* SomeClass::toArray(String str) 

我也打開其他建議如何從此函數返回數組。

+2

什麼是字符串? –

+0

我想問同樣的問題。但正如你看到的問題有arduino標籤。字符串是基於C或C++的Arduino語言的一個對象,但它們其中之一併不完全相同 –

回答

0

的是什麼String此代碼段

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

如果編譯導致不確定的行爲Independing因爲指針臨時要麼有一個不確定的值(如果它是一個局部變量)或NULL,你可能不消除它。

倘若此代碼段

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

是有效的,你可以例如

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

寫你不能爲指針添加任何東西,指針正好指向一些內存。 您需要先創建一些實例,如第二個示例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 
} 

順便說一句,從「指定者」的名字,它看起來像你想String實例,而不是字符串的指針數組。所以這些函數應該被定義爲String[] SomeClass::toArray(String str),仍然存在與內存所有權相同的問題。我想要做的就是不返回數組。 也許void SomeClass::toArray(const String & str, std::vector<String> & array),填入數據到array載體。

我不知道你在arduino上使用C++多少,如果std :: vector是好的,或者沒有,但有一個String類感覺像矢量<>也可以,特別是如果你是在浪費你的堆棧通過傳遞String的複製實例而不是引用。(除String是一些用於char[]的宏/ typedef,請不要告訴我......我的意思是,即使C++可以用低內存佔用的方式編寫,也不必在任何地方硬盤陣列,如果避免不必要分配C++類的臨時實例)。