我遇到了这段代码,并且对这里发生的事情感到有点困惑:
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;
}
因为双指针实际上指的是这里的东西。对第一段代码的任何帮助都将非常感激。
答案 0 :(得分:0)
在两个malloc之后,变量p包含一个指向malloc分配指针的指针,该指针又包含一个指向malloc分配的整数的指针:
+---+ +---+ +----+
p: | ----> | ----> | 10 |
+---+ +---+ +----+
答案 1 :(得分:0)
由于int **p
是指向指针的指针,它将保存int*
类型指针的位置或地址。但必须首先为int*
分配足够的内存,这些内存将存储在p
指向的位置。这一行完成了这项工作,初始化p
:
p = malloc(sizeof(int *));
现在,int*
的位置已知,必须分配内存以将int
存储在*p
指向的内存int*
,这是我们的malloc()
指针。因此,需要另一个int*
调用来初始化*p = malloc(sizeof(int));
类型指针。
**p
完成所有操作后,可以将整数分配给int
,这是*p
指向的**p = 10;
:
{{1}}