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
。
我想说的最后一部分是,对于指针数组,如果不使用下标运算符就无法解引用单个字符[]
这两段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
。
我想说的最后一部分是,对于指针数组,如果不使用下标运算符就无法解引用单个字符[]