我正在使用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特定的,无论我走到哪里,我都可以依赖它吗?
由于
答案 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>自动归零:除非给出初始化,或者它们由构造函数赋值,它们最初将包含随机垃圾(无论已经存在于该位置的内存中)。因此,初始化所有变量是一个好习惯 - 它不会伤害但可以提供帮助。