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

标签 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 的,无论我走到哪里,我都可以依赖它为 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/

相关文章:

c - 指针和整数比较警告 C

c - 如何在C文件中运行shell命令并在变量中分配一个整数?

c++ - 如果我将结构传递给可变参数函数会怎样?

c++ - 命名右值引用

c - 如何将命令行参数传递给我的主函数?

c - 如何检查 C 中目标文件中是否存在宏?

c++ - 如果分配的内存在构造函数抛出异常后被释放

c++ - NVIDIA NVCC 在使用模板特征类型时更改编译时间常量

c++ - 为什么 RHR 函数不能重载?

使用 fscanf 检查有效输入