【发布时间】:2010-10-07 00:20:01
【问题描述】:
我正在使用 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 吗?
谢谢
【问题讨论】:
-
将指针设为局部变量,您会发现它不会。您有一个未初始化的全局变量,编译器通常会将其放入零初始化的
.bss段中。 -
C 或 C++,它们是不同的语言。
-
@Jeff:编译器把它放在哪里无关紧要。如果它有静态存储时长,则需要进行零初始化。
-
与 Will a function pointer be NULL by default? 比较(这不是重复的,但相关并表明 Milo 需要在他的问题标题上多做一些工作)。
-
@Jeff:标准当然需要它,并且已经有 20 多年了。这是任何 C 程序员都应该知道的最基本的事情之一。