C:指针数组与指针到指针

C: Array of pointers vs pointer-to-pointer

这两段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.[=14= 更改其大小]

C内存分为几种,stacks——用于函数调用和局部变量,然后还有heap——用于malloced对象。堆栈的大小通常小于堆。因此,如果您尝试在堆栈中分配一个巨大的数组,您可能会超出堆栈的存储空间 space,从而导致段错误。

在这种情况下,当你 malloc 一个数组时,堆内存正在被使用。它会一直存在,直到它被显式地用 free 释放。这在您使用大数组的情况下很有用。 而在第一种情况下,您在堆栈中声明数组,只要调用它的函数存在,它就会存在。

由于这里的数组大小很小,所以两者都有效。但是对于更大的数组,建议使用 malloc'ing 以避免段错误。

在使用和功能方面,除了您打算如何使用它之外,确实没有区别。

我的意思的一个例子是我可以使用双指针来迭代和取消引用整个 multidim 数组。

更不用说当你 malloc 时,你需要一个匹配的 free 当你完成它时。

当然,只有当您认为确实需要它或需要大量内存时才应该 malloc

我想说的最后一部分是,对于指针数组,如果不使用下标运算符就无法解引用单个字符[]