2017-07-03 76 views
1

通過C++代碼時,我發現開發人員嘗試將一個新單元添加到char**變量中。這樣做時,以下是他用於爲新單元分配內存的代碼行。將內存分配給C++中的char *

*(plantValue + (plantCount-1)) = (char *) malloc(sizeof(char) * SAPPlantStr.length()); 

其中plantValuechar**plantCount是整數。

有人請解釋我上面的代碼行,因爲我無法理解它。

在此先感謝。

+8

的長度對於任何指針或數組'p'和索引'i',表達式'*(P + I)'等於'p [I]'。在您的具體情況下,這意味着'*(plantValue +(plantCount-1))'等於'plantValue [plantCount-1]'。希望這應該讓你更清楚。 –

+4

另外,如果你使用它來學習C++,你應該丟掉那些代碼。 「適當的」C++將爲字符串使用['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string),['std :: vector'](http: //en.cppreference.com/w/cpp/container/vector)爲動態「數組」。 –

+4

哦,並且可能存在您顯示的代碼中的錯誤,因爲分配不包含終止「\ 0」字符的空間。 –

回答

1

它看起來像在你的代碼plantValue是一個指針,指向原C風格的字符串數組,即:

   +----------+ 
plantValue --> | char * | --> String #1 
(char **)  +----------+ 
       | char * | --> String #2 
       +----------+ 
       | ... | 
       +----------+ 
       | char * | --> String #N 
       +----------+ 

因此,該代碼基本上是分配使用malloc()一個新的C風格的字符串,並將指針存儲在上述代表的char*向量中的槽中。

具體而言,plantCount-1是預分配指針數組中第一個可用時隙的索引; plantValue + (plantCount-1)指向該插槽,使用*(plantValue + (plantCount-1)) = ...可以在該插槽中寫入由malloc()返回的字符串指針。

請注意,上面的代碼比C++更C;例如,在C++中,對於顯式動態內存分配,您可以使用new[]而不是malloc();但更好的是,在C++中,您應該使用標準容器類,如std::vectorstd::string而不是原始char*擁有指針。這些C++類自動處理管理自己的內存,並簡化你的代碼很多。

P.S.還要注意的是C風格的字符串是NULL結尾的,因此當你爲一個新的字符串malloc()分配內存,你也應該考慮終止NUL當你計算長度(換句話說,你應該有SAPPlantStr.length() + 1在你的代碼)。

+0

感謝您的回覆。我澄清了我的疑問。 –

+0

不客氣。很高興有幫助。 –

0

plantValue [plantCount-1]包含一個指向分配的存儲器與SAPPlantStr

+0

這就是他應該如何寫的。指針解引用語法令人困惑。 –