在浏览C ++代码时,我遇到了一个开发人员试图将新单元格添加到char**
变量的行。在执行此操作时,以下是他用于为新单元分配内存的代码行。
*(plantValue + (plantCount-1)) = (char *) malloc(sizeof(char) * SAPPlantStr.length());
其中plantValue
为char**
,plantCount
为整数。
有人可以解释我上面的代码行,因为我无法理解。
提前致谢。
答案 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::vector
和std::string
,而不是拥有指针的原始char*
。这些C ++类自动管理自己的内存,并大量简化代码。
PS 另请注意,C样式字符串是NUL终止的,因此当您为malloc()
的新字符串分配内存时,在计算时也应考虑终止NUL 总长度(换句话说,您的代码中应该有SAPPlantStr.length() + 1
。)
答案 1 :(得分:0)
plantValue [plantCount-1]包含指向已分配内存的指针,其长度为SAPPlantStr