2012-04-10 106 views
7

我只是有蘋果的C/C++編譯器初始化浮到一個非零值(約「-0.1」)。默認初始化爲C的基本類型是什麼?

這是一個巨大的驚喜 - 只有偶爾發生(但100%的重複,如果通過同樣的功能調用運行/ ARGS事前)。追蹤(使用斷言)需要很長時間。

我還以爲浮標零初始化。谷歌搜索顯示,我想C++的(當然這是更爲精確的這個東西 - C.F. SO:What are primitive types default-initialized to in C++?)。

但也許蘋果公司在這裏的藉口是,他們的編譯器在C模式下運行......所以:什麼關於C?應該發生什麼,(更重要的)什麼是典型的?

(當然我應該手動初始化它 - 我通常做的 - 但我沒有這一個情況下,我沒想到它炸掉,雖然!)

(谷歌被證明是有害無益對於這個的討論 - 他們目前的搜索拒不顯示「C」沒有「C++」保持決定我太傻了,竟然無視,甚至我的輸入在高級模式下運行時)


這裏的實際源示例發生的地方。起初我以爲有可能與MAX的定義和ABS(也許MAX(ABS,ABS)總不你會期待什麼?)有問題......但斷言和調試挖,我終於發現有人失蹤初始化 - 花車漸漸init'd爲非零值非常偶然):如果沒有明確的初始化

float crossedVectorX = ... // generates a float 
float crossedVectorY = ... // generates a float 

float infitesimal; // no manual init 
float smallPositiveFloat = 2.0/MAX(ABS(crossedVectorX), ABS(crossedVectorY)); 

// NB: confirmed with debugger + assertions that smallPositiveFloat was always positive 

infitesimal += smallPositiveFloat; 

NSAssert(infitesimal >= 0.0, @"This is sometimes NOT TRUE"); 
+0

取決於「初始化」發生的位置 - 可能根本不初始化。 – Mat 2012-04-10 13:19:04

+0

添加了我看到問題的源代碼的複製/粘貼。對我來說,它應該被初始化? – Adam 2012-04-10 13:27:36

+1

+1詢問一個問題,即每個人都知道答案的好處。 – borrrden 2012-04-10 14:21:46

回答

17

只有靜態存儲期的對象初始化爲0

#include <stdio.h> 

float f;   // initialized to 0, file scope variables have static storage 
static float g; // initialized to 0 

int main(void) 
{ 
    float h; // not initialized to 0, automatic storage duration 
    static float i; // initialized to 0 

    return 0; 
} 

對象具有自動存儲持續時間(如h在上面的例子)中未明確初始化具有一個不確定的值。讀取它們的值是未定義的行爲。

爲了完整起見,編輯:,因爲如果沒有顯式的初始值設定項,帶有線程存儲時間的C11對象也會被初始化爲0

+2

謝謝。這裏有很多很好的答案,但是恕我直言,這樣做可以讓你一目瞭然地理解它。 – Adam 2012-04-10 13:35:43

+0

同意,我喜歡這個答案的格式。 – 2012-04-10 13:56:40

0

我不相信任何C標準定義變量的初始值。這將符合大人的C編程的一般理念和應用領域,他們可能有一天有理由希望他們的編譯器不爲他們初始化一個變量,並且知道這是他們的責任初始化他們自己的變量。

+2

如其他地方所述,文件和全局變量默認初始化爲零。 – Kevin 2012-04-10 13:37:09

5

靜態變量將初始化爲零,但我猜你正在談論一個局部變量(即堆棧,或自動) - 這些沒有初始化爲爲你,但獲得任何值在該內存上堆棧。

9

的標準的相關部分是§6.7.9段10:

如果具有自動存儲持續時間的對象沒有被明確初始化,它的值是不確定的。如果具有靜態或線程存儲時限的對象不明確初始化

,則:

如果你的變量有螺紋或靜態存儲,而不是,那麼該段的下一部分將生效:

- 如果它有指針類型,則它被初始化爲空指針;

- 如果它有算術類型,它被初始化爲(正或無符號)零;

...

我還要指出,你應該把你的編譯器的警告(特別是未初始化變量的警告),因爲這應該立即識別爲您解決問題。

1

我不得不把我的ķ&的R用這樣的回答:

在沒有明確的初始化,外部和靜態變量保證被初始化爲零;自動和寄存器變量具有未定義的(即垃圾)初始值。