2016-09-16 67 views
0

我有一個指向整數的指針數組的struct。第一個指針的值在對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',但'make'()'退出的時刻''停止存在。 –

+0

當內存不再保存在任何變量上時,程序結構的細節(如是否用函數創建東西)會影響內存何時被覆蓋。這兩種情況都沒有定義什麼行爲,但有時候這種未定義的行爲也是所期望的行爲 - 但這只是運氣。 – 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

謝謝 - 非常有幫助:) –