2016-09-16 18 views
0

整数へのポインタの配列を持つ構造体があります。最初のポインタの値は、printfへの呼び出しの間に変化しています。私は関数を介して構造体を生成しない限り、これは起こりません。コードは以下の通りです。誰かが何が起こっているか教えてもらえますか?ありがとう。構造体変数はprintfで値を変更します

struct a { 

    int *nums[10]; 

}; 

struct a *makeS(); 


int main(int argc, char *argv[]){ 

     struct a *_b = (struct a*) malloc(sizeof(struct a)); 

     struct a *_c = makeS(); 

     int i = 1; 

     _b->nums[0] = &i; 

     printf("Num is %d\n", *_b->nums[0]); // prints 1 
     printf("Num is %d\n", *_b->nums[0]); // prints 1 
     printf("Num is %d\n", *_b->nums[0]); // prints 1 
     printf("Num is %d\n", *_b->nums[0]); // prints 1 … etc. 


     printf("Num is %d\n", *_c->nums[0]); // prints 1 
     printf("Num is %d\n", *_c->nums[0]); // prints 0 
     printf("Num is %d\n", *_c->nums[0]); // prints 0 
     printf("Num is %d\n", *_c->nums[0]); // prints 0 … etc. 


    } 

    struct a* makeS(){ 

     struct a *_s = (struct a*) malloc(sizeof(struct a)); 

     int i = 1; 

     _s->nums[0] = &i; 

     return _s; 

} 
+2

あなたは '_s-> nums [0]'に '&i'を割り当てますが、' i'は 'makeS()'が終了する瞬間に存在しなくなります。 –

+0

メモリがもはやどの変数に対しても保持されていない場合、プログラム構造の詳細(関数を使ってstuffを作成するかどうかなど)は、どのメモリが上書きされるかに正確に影響します。両方の状況は、動作がどのようになるかについては未定義ですが、未定義の動作も望ましい動作ですが、それは単なる運に過ぎません。 – xaxxon

答えて

6

あなたの問題は、関数である:それはあなたがダングリングポインタを使用している意味、ローカル変数であるよう

struct a* makeS(){ 

     struct a *_s = (struct a*) malloc(sizeof(struct a)); 

     int i = 1; 

     _s->nums[0] = &i; 

     return _s; 

} 

int iは、スコープの外に出ます。

iによって使用されるメモリは、何か他のものによって自由に使用され、後でprintf呼び出しで使用されるバッファまたは作業領域によって再利用される可能性があります。

+0

ありがとう - 非常に有用:) –

関連する問題