2
#include <stdio.h>
void func(int **);

int main()
{

  int *arr[2];

  func(arr);

  printf("value [1] = %d \n",*arr[0]);

  printf("value [2] = %d \n",*arr[1]);
  return 0;
}

void func(int **arr)
{
  int j = 10;
  arr[0] = &j;
  arr[1] = &j;
}

コードは gcc で正常にコンパイルされます。ただし、出力は次のとおりです。

value [1] = 10 

value [2] = 32725 

2 番目の値はガベージ値です。なぜそうなのですか?ダブルポインタを正しく使用して配列にアクセスするにはどうすればよいですか?

4

2 に答える 2

9

未定義の動作です。関数を超えて存在しない
ローカル変数のアドレスを格納しています。関数スコープ内にのみ存在することが保証されています。このスコープが終了した後にそのアドレスを介して参照すると、未定義の動作が発生します。 j
j{ }j

未定義の動作とは、コンパイラが特定の観察された動作を示す必要がないことを意味し、したがって、コンパイラは任意の出力を表示できます。

于 2013-02-19T05:33:47.763 に答える
0
int j=10;

スタックに割り当てられたローカル変数です。関数の外で逆参照すると、未定義の動作になります。 警告:何をしているのかよくわからない限り、ローカル変数へのポインターを決して返さないでください。確信がある場合は、もう一度考えてみてください。

于 2013-02-19T05:37:36.223 に答える