0
#include<stdio.h>
int *sample();
int main(void)
{
  int *p;
  p=sample();
  printf("%d",*p);
  return 0;
}

int *sample()
{
  int *p,x=10;
  p=&x;
  return p;
}

上記のコードxはローカル変数です。上記をgccでコンパイルすると、出力が得られます:

10

ローカル変数は、それが宣言されている関数内でのみ有効であり、コントロールが関数の外に出ると、ローカル変数の割り当てを解除する必要があります。しかし、これは起こっていません。wWyその印刷10? 誰でもこの動作を説明できますか?

4

4 に答える 4

2

私はあなたのプログラムを少しだけ修正しました。下記参照。

#include<stdio.h>
int *sample();

void donothing ();

int main(void)
{
  int *p;
  p=sample();

  donothing();

  printf("in main(), *p = %d\n",*p);
  return 0;
}

int *sample()
{
  int *p,x=10;
  p=&x;

  return p;
}

void donothing ()
{
  int x[10], y;

  y = 17;
  return;
}

今実行すると、次のようになります...

amrith@amrith-vbox:~/so$ ./stack 
in main(), *p = 17
amrith@amrith-vbox:~/so$ 

ローカル変数のアドレスを返すことは決して安全ではありません。これは通常、スタック上で確立され、上書きされる可能性があるためです。

于 2013-08-15T10:41:10.170 に答える
0

プログラムには未定義の動作があります。ローカル変数の参照を返すと、予期しない動作が発生し、値がまだ残っているのは運が悪かっただけです。

于 2013-08-15T10:12:17.213 に答える
0

C にはガベージ コレクションはありません。

x、ローカル変数、終了時に存在しなくsampleなる

あなたのケースは未定義の動作です。

于 2013-08-15T10:24:15.697 に答える