取消引用指针的指针

时间:2013-02-19 17:03:57

标签: c pointers dereference

给出以下代码

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

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

有人可以解释实际发生的事情吗?

为什么该行和下一个print语句不相同?

由于

2 个答案:

答案 0 :(得分:6)

> Can some one please explain what is actually happening?

这是一个operation precedence问题:

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

请注意在foo->bar之前对[1]的deference进行分组的额外parens,您需要这样做,因为下标([])运算符的优先级高于取消引用({{{ 1}})运算符

*

因为通过分解您处理操作顺序问题的语句,您首先进行了较低优先级操作:

> Why is that line and the next print statement not equivalent?

答案 1 :(得分:2)

数组索引运算符[]的优先级高于deference *运算符。因此,该行意味着“尊重int *数组的索引1处的foo->bar”。但是,当然,您只有1 int *(索引0)的数组,因此会产生seg错误。