这两段 C 代码是否达到了相同的目标:
char ** p;
p = malloc(sizeof(char*) * 10);
--------------------------------
char * z[10];
似乎它们可以相同地使用:
p[1] = "Foo";
*(p+2) = "Bar";
---------------------
z[1] = "Foo";
*(z+2) = "Bar";
有区别吗?
这两段 C 代码是否达到了相同的目标:
char ** p;
p = malloc(sizeof(char*) * 10);
--------------------------------
char * z[10];
似乎它们可以相同地使用:
p[1] = "Foo";
*(p+2) = "Bar";
---------------------
z[1] = "Foo";
*(z+2) = "Bar";
有区别吗?
如果您只是从数组或 malloc 分配的区域存储和检索值,它们的工作方式相同。
不过也有区别。sizeof
并且&
工作方式不同,您需要显式free
分配 malloc 分配的区域来释放内存,并且可以使用realloc
.
在使用和功能方面,除了你打算如何使用它之外,真的没有什么区别。
我的意思的一个例子是我可以使用双指针来迭代和取消引用整个 multidim 数组。
更不用说当你完成时malloc
,你需要一个匹配free
。
当然,只有malloc
当你认为你真的需要它或者你需要大量内存时才应该这样做。
最后我想说的是,使用指针数组,不使用下标运算符就不能取消引用单个字符[]
C 内存分为几种类型,堆栈- 用于函数调用和局部变量,然后有堆- 用于分配对象。堆栈的大小通常比堆小。因此,如果您尝试在堆栈中分配一个巨大的数组,您可能会超出堆栈的存储空间,从而导致段错误。
在这种情况下,当你 malloc 一个数组时,堆内存正在被使用。它会一直存在,直到它被显式地释放释放。这在您使用大数组大小的情况下很有用。而在第一种情况下,您在堆栈中声明数组,该数组仅在调用它的函数存在时才存在。
由于这里的数组大小很小,所以两者都有效。但是对于较大的数组,建议使用 malloc'ing 以避免 segfault。