在學習關於C語言指針的時候,發現這樣一個問題,代碼以下:函數
#include<stdio.h> #include<stdlib.h> #include<string.h> struct A{ int a; char b; }; struct B{ struct A *n; }; struct B *new_B(){ struct A t = { 100, 'c'}; struct B *p; p = (struct B *) malloc(sizeof(struct B)); p->n = &t; return p; } int main(void) { struct B *p; p = new_B(); printf("%d, %c\n", p->n->a, p->n->b); free(p); return 0; }
函數new_B的做用是新建一個結構體B的指針變量p,併爲它分配內存,而後在函數中創建一個結構體A的變量t,並把這個變量的地址&t賦給B的成員n(n是結構體A的指針)。咱們知道, t是一個局部變量,存放在棧中,在函數new_B執行結束後,t會被釋放。而當咱們返回主函數,而後輸出,能夠獲得正確的結果。若是咱們去掉分配內存這一行,也就是p = (struct B *) malloc(sizeof(struct B)); 執行就會出錯(這也是我想要獲得的結果)。學習
問題是,就算分配了內存,new_B函數執行完之後t就會被釋放掉,那麼在主函數訪問 p->n是,應該也會出錯。爲何在主函數中還能夠訪問呢? spa
請大牛給予指導解答!!!指針