簡體   English   中英

函數指針總是初始化為NULL嗎?

[英]Will function pointers always initialize to NULL?

我正在使用MSVC,看起來下面的代碼沒有崩潰,編譯器將函數指針初始化為NULL。

int (*operate)(int a, int b);
int add(int a, int b)
{
    return a + b;
}

int subtract(int a, int b)
{
    return a - b;
}

int main()
{


    if(operate) //would crash here if not NULL
    {
        cout << operate(5,5);
    }

    operate = add;
    if(operate)
    {
        cout << operate(5,5);
    }

    operate = subtract;
    if(operate)
    {
        cout << operate(5,5);
    }
    return 0;
}

所以似乎MSVC將函數指針初始化為NULL,但如果我在Linux上的gcc上構建它也會為NULL嗎? 它是常規的還是MSVC特定的,無論我走到哪里,我都可以依賴它嗎?

謝謝

operate初始化為NULL,因為它是一個全局變量,而不是因為它是一個函數指針。 如果沒有給出初始化,則具有靜態存儲持續時間的所有對象(包括全局變量,文件級static變量和函數中的static變量)初始化為0或NULL。

[編輯回應Jim Buck的評論:]在C ++中,這由語言標准的第3.6.2 / 1條保證,它開始於:

具有靜態存儲持續時間(3.7.1)的對象應在任何其他初始化發生之前進行零初始化(8.5)。 使用常量表達式進行零初始化和初始化統稱為靜態初始化 ; 所有其他初始化是動態初始化

我希望C的行為也是如此,因為C ++在大多數情況下都是與它兼容的,盡管我沒有它的標准。

[編輯#2]正如Jeff M在評論中指出的那樣,重要的是要意識到自動存儲持續時間的變量(即“普通”局部變量) 不會自動進行零初始化:除非給出初始化,否則它們是通過構造函數賦值,它們最初將包含隨機垃圾(無論已經存在於該位置的內存中)。 因此,初始化所有變量是一個好習慣 - 它不會傷害但可以提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM