0

给出以下代码

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

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

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

为什么该行和下一个打印语句不等效?

谢谢

4

2 回答 2

6

> Can some one please explain what is actually happening?

这是一个操作优先级问题:

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

foo->bar请注意额外的括号对之前的尊重进行分组[1],您需要这样做,因为下标 ( ) 运算符比取消引用 ( ) 运算[]符具有更高的优先级*

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

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

int *tmp2 = *(foo->bar);
于 2013-02-19T17:09:43.877 回答
2

数组索引运算符[]的优先级高于参考*运算符。因此,该行的意思是“尊重数组int *的索引 1 ”。foo->bar但是,当然,您只有一个 1 数组int *(索引 0),因此会导致 seg 错误。

于 2013-02-19T17:09:51.570 回答