在C ++中将内存分配给char *

时间:2017-07-03 10:54:48

标签: c++ memory-management

在浏览C ++代码时,我遇到了一个开发人员试图将新单元格添加到char**变量的行。在执行此操作时,以下是他用于为新单元分配内存的代码行。

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

其中plantValuechar**plantCount为整数。

有人可以解释我上面的代码行,因为我无法理解。

提前致谢。

2 个答案:

答案 0 :(得分:2)

看起来代码中的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 ++类自动管理自己的内存,并大量简化代码。

PS 另请注意,C样式字符串是NUL终止的,因此当您为malloc()的新字符串分配内存时,在计算时也应考虑终止NUL 长度(换句话说,您的代码中应该有SAPPlantStr.length() + 1。)

答案 1 :(得分:0)

plantValue [plantCount-1]包含指向已分配内存的指针,其长度为SAPPlantStr