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

コメントアウトされた行は、セグメンテーション違反を引き起こします。

誰かが実際に何が起こっているのか説明してもらえますか?

その行と次の print ステートメントが等しくないのはなぜですか?

ありがとう

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) しかないため、セグ フォールトが発生します。

于 2013-02-19T17:09:51.570 に答える