【问题标题】:Understanding Pointer to Pointer Logic in C理解 C 中的指针到指针逻辑
【发布时间】: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


【解决方案1】:

由于int **p 是一个指向指针的指针,它将保存int* 类型的指针的位置或地址。但是必须首先为int* 分配足够的内存,这些内存将存储在p 指向的位置。这一行完成这项工作,它初始化p

p = malloc(sizeof(int *));

现在,int* 的位置已知,必须分配内存以在*p 指向的内存处存储实际的int,这是我们的int* 指针。所以需要另一个malloc()调用来初始化int*类型指针。

*p = malloc(sizeof(int));

全部完成后,可以给**p赋值一个整数,也就是*p指向的int

**p = 10;

【讨论】:

  • @throw233 您不必立即接受答案。一般来说,在接受一个之前至少等待几个小时是好的,因为稍后可能会有更详细或更好的答案。如果您发现一些有用的答案,点赞是一种很好的方式来应用它,您可以稍后接受最好的。
  • 是的,我想通了,但目前,您需要了解更多细节。
【解决方案2】:

在两个 malloc 之后,变量 p 包含一个指向 malloc 分配的指针的指针,该指针又包含一个指向 malloc 分配的整数的指针:

   +---+    +---+    +----+
p: |  ----> |  ----> | 10 |
   +---+    +---+    +----+

【讨论】:

  • 有道理,我想这并不总是那么明显。
猜你喜欢
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
相关资源
最近更新 更多