2

本当にばかげた質問。ここに私のサンプルコードがあります:

#include <stdio.h>
#include <stdlib.h>

typedef struct sample {
  int a;
  int b;
} SAMPLE_T;

int main() {
  int i, max = 4;
  for (i = 0; i < max; i++)
  {
     SAMPLE_T * newsamp = (SAMPLE_T *)malloc(sizeof(SAMPLE_T));
     printf("addr: %x\n", &newsamp);
  }
}

mallocループを通過するたびに新しい変数を「作成」しようとしていますが、ヒープに新しい変数が作成されるため、これでうまくいくと思いました。だけど、なんかズレちゃったみたい。出力は次のとおりです。

addr: bfc29c4
addr: bfc29c4
addr: bfc29c4
addr: bfc29c4

私はどのようmallocに働いているのか理解していませんか?

4

3 に答える 3

7

newsamp のアドレスは変更されていませんが、これは当然のことです。試す:

 printf("addr: %x\n", newsamp)

また、これは明らかにただのおもちゃのプログラムですが、ループが終了する前にメモリを解放する必要があります。

于 2012-04-15T18:46:47.890 に答える
5

newsampこれは、のスタック上の変数であるポインター (!!!!) のアドレスを出力しているためですmain。いつも同じです。

代わりにポインタ自体を印刷したい:

printf("addr: %x\n", newsamp);
于 2012-04-15T18:46:16.320 に答える
1

そのはずprintf("addr: %x\n", newsamp);

&newsampポインターが指すものではなく、ポインターのアドレスを取得しているため、行うべきではありません。

于 2012-04-15T18:47:02.310 に答える