-1

这两段 C 代码是否达到了相同的目标:

char ** p;
p = malloc(sizeof(char*) * 10);

--------------------------------

char * z[10];

似乎它们可以相同地使用:

p[1] = "Foo";
*(p+2) = "Bar";

---------------------

z[1] = "Foo";
*(z+2) = "Bar";

有区别吗?

4

3 回答 3

2

如果您只是从数组或 malloc 分配的区域存储和检索值,它们的工作方式相同。

不过也有区别。sizeof并且&工作方式不同,您需要显式free分配 malloc 分配的区域来释放内存,并且可以使用realloc.

于 2016-05-24T13:21:27.010 回答
0

在使用和功能方面,除了你打算如何使用它之外,真的没有什么区别。

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

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

当然,只有malloc当你认为你真的需要它或者你需要大量内存时才应该这样做。

最后我想说的是,使用指针数组,不使用下标运算符就不能取消引用单个字符[]

于 2017-07-01T04:50:10.183 回答
-1

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

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

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

于 2017-07-01T04:42:26.027 回答