我最近了解到了靜態變數,它們在各種函式呼叫之間保留其值。然后我寫了一些代碼來測驗它,希望它能完美運行。但后來我不小心把區域變數宣告開頭的static關鍵字去掉了,實際的問題就出現了。 除了在宣告中沒有static關鍵字外,兩個程式的輸出結果都差不多。
代碼沒有任何靜態宣告:
#include <stdio.h>
void up()。
int main(){
up(); /Output: 1
up(); //Output: 2
return 0。
}
void up(){
int stvar;
stvar 。
printf("%d
", stvar)。)
}
代碼帶有靜態宣告:
#include <stdio.h>
void up()。
int main(){
up(); /Output: 1
up(); //Output: 2
return 0。
}
void up(){
static int stvar;
stvar 。
printf("%d
", stvar)。)
}
最后我試了一下這個,只是初始化了本地變數:
void up()。
int main(){
up(); /Output: 1
up(); //Output: 1
return 0。
}
void up(){
int stvar = 0;
stvar 。
printf("%d
", stvar)。)
}
這一次,區域變數顯示了它的自然行為。 我只是想知道,未初始化的區域變數是否默認為靜態變數?
uj5u.com熱心網友回復:
不,它們默認不是靜態。原則上,初始值可以是任何東西。使用該值甚至可能是未定義的行為。在實踐中,編譯器為堆疊中的變數選擇了一個記憶體位置,而變數的初始值就是已經在該記憶體位置的任何東西。
由于你在第一個up()和第二個up()之間沒有運行任何其他代碼,在實踐中,你的程式可能會兩次挑選相同的位置,因此它仍然有之前的值。如果你在兩者之間呼叫另一個函式,該函式的區域變數將進入之前被up()的區域變數所使用的空間,這將覆寫第一個up()的值。
你當然不能依賴它。即使你在中間沒有呼叫任何其他函式,編譯器也可能會 "偷偷 "添加一個(出于各種原因)。或者編譯器可能決定在兩次呼叫up之間調整堆疊,因此每次呼叫都可能為其區域變數獲得一個不同的堆疊位置。
你也不能保證第一個值是0。因為它是任何碰巧已經在該記憶體位置的東西,它可能是以前的函式留下的東西。main并不是第一個被呼叫的函式;在標準庫中有一些函式在呼叫main之前進行了設定作業。
uj5u.com熱心網友回復:
使用非初始化的自動變數是危險的。
如果沒有采取任何地址,這就是未定義行為。
否則,就像在你的例子中,stvar的值將是不確定的。它的值可以是任意的,它甚至可能在訪問之間發生變化。
總是初始化區域變數。
總是初始化區域變數。
注意,如果沒有明確地初始化靜態存盤的變數(globals和static),則會被zero初始化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/316190.html
標籤:
上一篇:在Python中操作函式中的變數
