【问题标题】:dereferencing pointer to a pointer取消引用指向指针的指针
【发布时间】:2013-02-19 17:03:56
【问题描述】:

给定以下代码

#include <stdlib.h>
#include <stdio.h>
typedef struct Foo {
  int **bar;
}Foo;


int main(){
  Foo *foo = malloc(sizeof(Foo));
  foo->bar = malloc(sizeof(int**));
  int *tmp = malloc(sizeof(int)*2);
  tmp[0]= 0;
  tmp[1]=1;
  *(foo->bar) = tmp;
  //printf("%d",*(foo->bar)[1]);  <=== This line                                                                                                                                                                                   
  int *tmp2 = *(foo->bar);
  printf("%d ",tmp2[1]);

  return 0;
}

注释掉的行会导致分段错误。

谁能解释一下到底发生了什么?

为什么那行和下一个打印语句不等价?

谢谢

【问题讨论】:

    标签: c pointers dereference


    【解决方案1】:

    &gt; Can some one please explain what is actually happening?

    这是operation precedence 的问题:

    printf("%d",(*(foo->bar))[1]); // <=== This is what you wanted
    

    注意在[1] 之前将foo-&gt;bar 的尊重分组的额外括号,您需要这样做,因为下标([])运算符的优先级高于取消引用(*)运算符

    &gt; Why is that line and the next print statement not equivalent?

    因为通过分解语句来处理操作顺序问题,您使较低优先级的操作首先发生:

    int *tmp2 = *(foo->bar);
    

    【讨论】:

      【解决方案2】:

      数组索引运算符[] 的优先级高于遵循* 运算符。因此,该行的意思是“在foo-&gt;bar 数组的索引1 处尊重int *”。但是当然,你只有一个 1 int *(索引 0)的数组,所以会导致 seg 错误。

      【讨论】:

        最近更新 更多