2012-04-15 7 views
2

本当にばかな質問です。ここに私のサンプルコードは次のとおりです。mallocが新しい変数を作成していないように見えるのはなぜですか?

#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はどのように機能しているのですか?

答えて

7

アドレスは驚くべきことではないである、変更されていません。試してみてください:

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

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

+0

その '本当の'コードでは、私は間違いなく無料で確実にしています。ありがとう。 – Pat

+0

アドレスの印刷中は "%p"を使用する方がよいでしょう。 – Arun

5

これは、mainのスタック上の変数であるポインタnewsamp(!!!!)のアドレスを印刷しているためです。それは常に同じです。あなたが代わりにポインタ自体を印刷したい

:newsampの

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

ああ、私は本当にばかな質問の部分については正しかった。ありがとう。 – Pat

1

それはそれはそれが何を指して、ポインタのアドレスを取っていないされているため、あなたは&newsampを行うべきではありませんprintf("addr: %x\n", newsamp);

でなければなりません。

関連する問題