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

标签 c++ memory-management

在查看 C++ 代码时,我遇到了开发人员试图将新单元格添加到 char** 变量的一行。这样做时,下面是他用来为新单元格分配内存的代码行。

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

其中 plantValuechar**plantCount 是一个整数。

谁能解释一下上面的代码行,因为我无法理解。

提前致谢。

最佳答案

看起来你的代码中的 plantValue 是指向原始 C 风格字符串的指针数组的指针,即:

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

因此,该代码基本上是使用 malloc() 分配一个新的 C 风格字符串,并将指向它的指针存储在所表示的 char* vector 中的一个槽中以上。

特别地,plantCount-1 是预分配指针数组中第一个可用槽的索引; plantValue + (plantCount-1) 指向那个插槽,并使用 *(plantValue + (plantCount-1)) = ... 写入由 malloc() 在那个插槽中。

请注意,上面的代码更多的是 C 而不是 C++;例如,在 C++ 中,您将使用 new[] 而不是 malloc() 来进行显式动态内存分配;但是,更好的是,在 C++ 中,您应该使用标准的容器类,例如 std::vectorstd::string 而不是原始的 char* 拥有指针。这些 C++ 类自动管理它们自己的内存,并大大简化您的代码。

P.S. 另请注意,C 风格的字符串以 NUL 结尾,因此当您使用 malloc() 为新字符串分配内存时,您还应该考虑终止符当您计算 长度时为 NUL(换句话说,您的代码中应该有 SAPPlantStr.length() + 1)。

关于c++ - 在 C++ 中将内存分配给 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44883796/

相关文章:

c++ - 为什么我的析构函数异常没有被捕获

c++ - 在 C++ 中评估文本文件中的表达式语句

objective-c - 为什么要使用类方法构造函数而不是 alloc/init?

c# - 如何在 C# 中尽可能快地填充内存

c++ - 我可以将一个内存池用于多个 vector 吗?

c++ - 管道中的 DirectX11 像素着色器丢失

c++ - 声明和初始化指针到指针字符数组

c++ - 从 char* 初始化 std::string 而不复制

c - 错误 : free(): invalid next size (fast)

java - java中通过函数调用给data赋值之前不需要使用new显式分配内存吗