我正在使用 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 的,无论我走到哪里,我都可以依赖它为 NULL 吗?
谢谢
最佳答案
operate
被初始化为 NULL 因为它是一个全局变量,而不是因为它是一个函数指针。所有具有静态存储持续时间的对象(包括全局变量、文件级 static
变量和函数中的 static
变量)都被初始化为 0 或 NULL 如果没有给出初始化程序。
[编辑以回应 Jim Buck 的评论:] 在 C++ 中,这由语言标准的条款 3.6.2/1 保证,该条款开始于:
Objects with static storage duration (3.7.1) shall be zero-initialized (8.5) before any other initialization takes place. Zero-initialization and initialization with a constant expression are collectively called static initialization; all other initialization is dynamic initialization.
我希望 C 也有同样的行为,因为 C++ 被设计为在大多数事情上都与它兼容,尽管我没有它的标准。
[EDIT #2] 正如 Jeff M 在评论中指出的那样,重要的是要认识到自动存储持续时间的变量(即“普通”局部变量)不是 自动零初始化:除非给出初始化器,或者它们由构造函数赋值,否则它们最初将包含随机垃圾(无论该位置已经位于内存中)。因此,初始化所有变量是一个好习惯——它不会有坏处,但会有所帮助。
关于c++ - 函数指针总是初始化为 NULL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877862/