面試時經常會考到這樣一道改錯題:
#includeint* function(int parameter)
int a = parameter;
a += 1;
printf("在fuction函式中,變數a的值是%d, 變數a的位址是%d\n", a, &a);
return &a;
int main()
int parameter = 10;
int *p = function(parameter);
printf("指標p的值是%d, p指向的值是%d\n", p, *p);
return 0;
程式原意是在main函式中定義乙個變數 parameter,將其傳遞到函式function中,將parameter賦值給變數a,將a的位址返回給main函式,在main函式再通過a的位址來訪問a的值。先來看程式的執行結果:
從執行結果看出,變數a在function函式中的值是11,且位址是1244900。在main函式中,a的位址還是1244900,但是值卻是4198508!
本道題錯在沒有正確理解變數的生命週期。 在function函式執行完後,變數a的生命週期也隨之結束,即系統會**a的儲存區域,因此這塊儲存區域存什麼,那是系統的事情,我們就不得而知了。有關變數的作用域的詳細情況,一般的教材都會講到,讀者可以參考相關教材。
變數的生命週期
from 今天在論壇上看到有朋友發帖問道 既然靜態全域性變數與全域性變數都儲存在全域性資料區,為什麼作用域卻不一樣呢?也許答案非常簡單 c 就是這麼規定的,靜態全域性變數與全域性變數的唯一區別就是作用域不同。對乙個c 變數來說,有兩個屬性非常重要 作用域和生命週期,它們從兩個不同的維度描述了乙個變數...
變數的生命週期
1 全域性變數 作用域 全域性作用域 只需要在乙個原始檔中定義,就可以作用於所有的原始檔 生命週期 程式執行期一直存在 記憶體分布 全域性 靜態儲存區 注意 如果再兩個檔案中都定義了相同名字的全域性變數,則連線錯誤 變數重定義。2 全域性靜態變數 生命週期 程式執行期一直存在 作用域 檔案作用域 只...
activity生命週期的乙個坑
今天專案中碰到乙個和activity生命週期有關的坑,特此記錄。背景 activity launchmode singleninstance 在多次啟動關閉後,在最後一次關閉 呼叫finish 生命只走到了onpause,此時再次launch後,這兩次的生命週期變成 oncreate onresum...