通過C++代碼時,我發現開發人員嘗試將一個新單元添加到char**
變量中。這樣做時,以下是他用於爲新單元分配內存的代碼行。將內存分配給C++中的char *
*(plantValue + (plantCount-1)) = (char *) malloc(sizeof(char) * SAPPlantStr.length());
其中plantValue
是char**
和plantCount
是整數。
有人請解釋我上面的代碼行,因爲我無法理解它。
在此先感謝。
通過C++代碼時,我發現開發人員嘗試將一個新單元添加到char**
變量中。這樣做時,以下是他用於爲新單元分配內存的代碼行。將內存分配給C++中的char *
*(plantValue + (plantCount-1)) = (char *) malloc(sizeof(char) * SAPPlantStr.length());
其中plantValue
是char**
和plantCount
是整數。
有人請解釋我上面的代碼行,因爲我無法理解它。
在此先感謝。
它看起來像在你的代碼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::vector
和std::string
而不是原始char*
擁有指針。這些C++類自動處理管理自己的內存,並簡化你的代碼很多。
P.S.還要注意的是C風格的字符串是NULL結尾的,因此當你爲一個新的字符串malloc()
分配內存,你也應該考慮終止NUL當你計算總長度(換句話說,你應該有SAPPlantStr.length() + 1
在你的代碼)。
感謝您的回覆。我澄清了我的疑問。 –
不客氣。很高興有幫助。 –
plantValue [plantCount-1]包含一個指向分配的存儲器與SAPPlantStr
這就是他應該如何寫的。指針解引用語法令人困惑。 –
的長度對於任何指針或數組'p'和索引'i',表達式'*(P + I)'等於'p [I]'。在您的具體情況下,這意味着'*(plantValue +(plantCount-1))'等於'plantValue [plantCount-1]'。希望這應該讓你更清楚。 –
另外,如果你使用它來學習C++,你應該丟掉那些代碼。 「適當的」C++將爲字符串使用['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string),['std :: vector'](http: //en.cppreference.com/w/cpp/container/vector)爲動態「數組」。 –
哦,並且可能存在您顯示的代碼中的錯誤,因爲分配不包含終止「\ 0」字符的空間。 –