理解C中指针逻辑的指针

时间:2016-10-13 21:08:36

标签: c pointers memory-management malloc

我遇到了这段代码,并且对这里发生的事情感到有点困惑:

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;
}

因为双指针实际上指的是这里的东西。对第一段代码的任何帮助都将非常感激。

2 个答案:

答案 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}}