-1

やってみる :

#include <stdio.h>
#include <malloc.h>

void foo(int* x)
{
   x = (int *)malloc(sizeof(int));
   *x = 5;
}

int main()
{

   int a;
   foo(&a);
   printf("%d\n",a);  //a = -858993460
   return 0;    

}

なぜ a != 5 の値。このコードをvs2010、windows 7で実行します。

4

4 に答える 4

1
  • foo(&a);変数のアドレスを関数に渡します。

  • void foo(int* x)渡されたアドレスがコピーされ、 に保存されxます。x関数にローカルなポインター変数です。

  • x = (int *)malloc(sizeof(int));. xここでは、動的に割り当てられたメモリに、まったく異なるアドレスで内容を上書きします。

  • *x = 5;ここでは、ヒープ上にあるメモリに値 5 を割り当てます。

  • }ここで、関数で行ったすべてのことを忘れています。メモリを作成しなかったため、メモリリークが発生しfree()ます。それとは別に、関数はプログラムの残りの部分に影響を与えることは何もしていません。ローカル変数をいじっただけですx

  • printf("%d\n",a);ここでは、関数によって変更されていない、初期化されていない変数 の内容を出力しaます。

さらに、C で malloc の結果をキャストすることはまったく意味がありませんstdlib.h。を使用しないでください。これmalloc.hは余分な非標準ヘッダーです。

于 2013-11-13T07:51:12.277 に答える
-1

ではfoo、 variableはローカル変数、つまり int へのポインタです。これは、メモリ内xの のアドレスである値を含む変数です。int

aメインの変数のアドレスで関数を呼び出しています。しかし、あなたはxを変えています

x = (int *)malloc(sizeof(int));

これは、別の値に変更xされます。これは、現在使用するために予約されているメモリ領域のアドレスです。ただし、xはローカル変数ですfoofoo終了すると、離れxて、 に戻りmainます。次の 2 つのことが発生しました。

  1. いくつかのメモリを割り当てましたが、
  2. それに値を割り当てました。

main次に、 sの内容を出力しますaafoo を呼び出す前と同じ場所にまだあります。

おそらく、関連する質問に対するこの以前の回答が役に立ちます:転送方法のポインターエラー(c ++)

于 2013-11-13T07:00:25.717 に答える