函数指针总是初始化为NULL吗?

时间:2010-10-07 00:20:01

标签: c++ c

我正在使用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特定的,无论我走到哪里,我都可以依赖它吗?

由于

1 个答案:

答案 0 :(得分:17)

operate初始化为NULL,因为它是一个全局变量,而不是因为它是一个函数指针。具有静态存储持续时间的所有对象(包括函数中的全局变量,文件级static变量和static变量)如果没有给出初始化,则初始化为0或NULL。

[编辑回应Jim Buck的评论:] 在C ++中,这由语言标准的第3.6.2 / 1条保证,它开始于:

  

具有静态存储持续时间的对象   (3.7.1)应为零初始化   (8.5)在任何其他初始化之前   发生了。零初始化和   用常量初始化   表达被统称为   静态初始化;所有其他   初始化是动态的   初始化

我希望C的行为也是如此,因为C ++在大多数情况下都是与它兼容的,尽管我没有它的标准。

[编辑#2] 正如Jeff M在评论中指出的那样,重要的是要意识到自动存储持续时间的变量(即“普通”局部变量)不< / em>自动归零:除非给出初始化,或者它们由构造函数赋值,它们最初将包含随机垃圾(无论已经存在于该位置的内存中)。因此,初始化所有变量是一个好习惯 - 它不会伤害但可以提供帮助。