2012-11-14 114 views
0
void testFunc(int); 

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

    testFunc(1); 
    testFunc(2); 
    testFunc(3); 

    return (EXIT_SUCCESS); 
} 

void testFunc(int another) 
{ 
    int num; 
    printf("num: %i\n", num); 
    num = another; 
} 

輸出: 編號:127383283 人數:1 人數:2爲什麼這個非靜態變量通過函數調用保持其值?

如果我打印變量之前我就每次分配到的東西,我不應該總是得到無用值沒有static關鍵字?

+2

這是未定義的行爲,不要浪費你的時間試圖推斷破碎的代碼。 – Blastfurnace

回答

6

獲取垃圾值 - 在這種情況下恰好如此,這些垃圾值恰好是您在前一次調用該函數時分配的值。

如果在調用testFunc()之間調用另一個函數,或者使用更高優化設置或使用其他編譯器進行編譯,則可能會看到完全不同的內容。

+0

好的謝謝。所以如果我將num聲明爲靜態的,那麼它應該適當地保留這個值? –

+1

@ user1438339是的。它會。 – CCoder

2

未初始化的num的值是不確定
它可以是任何東西。你不能依賴它是任何特定的。
請注意,使用此不確定的值會導致未定義的行爲,所以此程序具有未定義的行爲。

3

因爲它最終每次都使用相同的內存來存儲沒有改變的變量。

此行爲被視爲未定義。雖然它可能在您的特定情況下可靠地工作,但不會在所有情況下都依賴它。

你爲什麼不開始接受一些答案,爲了地獄的緣故?

+0

哈我的壞。我選擇了一個,並給你一個upvote。謝謝你指出這一點,我沒有意識到我一直忘記選擇。 –

1

在C/C++中,您的自動變量不保證具有任何特定的值,除非您將它們初始化爲您想要的值。所以這是由設計

-1

靜態只是意味着它不能在編譯時間後改變。一旦你聲明瞭這個價值,它將在代碼的生命週期中保持不變。由於您在函數的結尾處設置了值,因此它可以工作第二和第三次。

如果將其設置爲靜態,則無法將值分配給該函數。

+0

抱歉,但這是錯誤的。 'static'關鍵字與對象的存儲類(生命週期)有關。 'static'關鍵字不會阻止您更改對象的值。 – Blastfurnace

+0

你可以分配所有你想要的靜態變量。'const',另一方面,你必須初始化並且只能讀取。 – chris

+0

對不起 - 完全失去了一個我的想法。是多任務處理。感謝您的更正。 – Paronity

1

這是一個意外。添加另一個功能:

int use_stack(void) 
{ 
    int a[4] = { rand(), rand(), rand(), rand() }; 
    int j = 0; 
    for (int i = 0; i < 4; i++) 
     j += a[i]; 
    return j; 
} 

稱它爲前兩個testFunc()來電之後。您可能會在testFunc()中看到一個隨機值作爲「保存的值」。

形式上,你所看到的行爲是未定義的行爲,任何事情都可能發生。

相關問題