【发布时间】:2016-10-13 21:08:36
【问题描述】:
我遇到了这段代码,对这里到底发生了什么有点困惑:
int **p;
p = malloc(sizeof(int *));
*p = malloc(sizeof(int));
**p = 10;
printf("%d\n",**p);
首先,p 是一个指向指针的指针,但它不指向其他任何东西,那么为什么我们必须在这里 malloc 两次呢?同样在第一次 malloc 调用中,为什么不需要在 p 周围有两个指针值: 例如:
**p = malloc(sizeof(int *));
而不是:
p = malloc(sizeof(int *));
我知道下一行引用是指针并将值 10 存储在其中,然后打印它。但是,我并没有真正理解前面的几行,或者至少为什么他们是在那种心态下完成的。
我习惯于在这种心态下看到双指针:
int main(void) {
int *ptr;
int **ptr_ptr;
ptr = malloc(sizeof(int));
*ptr = 5;
ptr_ptr = &ptr;
printf("%d\n",**ptr_ptr); /*prints 5*/
free(ptr);
return 0;
}
因为双指针实际上指向了这里的东西。任何有关第一段代码的帮助将不胜感激。
【问题讨论】:
-
你最后一段代码坏了,你写的是
*ptr但是ptr是未初始化的 -
和我最后的代码一样?它在我的系统上编译。
-
也许您将
**p = malloc(sizeof(int *));与int **p = malloc(sizeof(int *));混淆了。在第一种情况下,您正在通过尚未初始化的指针进行写入。在第二种情况下,它一次性完成,初始化p。 -
“p 是一个指向指针的指针,但它不指向其他任何东西” - 如果它是
int *p; p = malloc(sizeof(int));那么p是否“指向其他任何东西”? -
@throw233 “在我的系统上编译”不能保证正确性
标签: c pointers memory-management malloc