如何使用未初始化的指针在C ++中修复C4700警告?

时间:2014-11-17 00:41:07

标签: c++ visual-studio pointers struct warnings

我已阅读过C4700上的许多帖子,但我似乎找不到解决问题的方法。

我编写了一个用于演示struct指针的小脚本:

struct foo
{
    int * bar;
};

#include<iostream>
using namespace std;
int main()
{
    foo * fooptr;
    int * num;
    *num = 25;
    *fooptr->bar = *num;
    cout << "now fooptr points to a foo struct whose bar points to: " << *fooptr->bar;

    fooptr->bar = num;
    cout <<"now fooptr's struct's bar shares memory address with num at " <<num;

    return 0;
}

当我编译它时,我得到两个C4700警告,用于未初始化的局部变量num和fooptr。 我继续将两者初始化为NULL,因此编译器错误消失但不出意外我得到了一个例外:

tests.exe中0x00265DF7处的未处理异常:0xC0000005:访问冲突写入位置0x00000000。

你看我总是认为当我没有初始化这些指针时,它们会被随机地址自动初始化(就像未初始化的ints / chars / double将被分配为垃圾) - 所以不应该这样吗?

如果在这种情况下初始化确实是绝对必要的(为什么?),那么这个问题有一个简单的解决方法吗?

3 个答案:

答案 0 :(得分:3)

未初始化的变量未初始化为随机值,它们未初始化。在机器代码级别,它们具有创建时的任何值。这可能是也可能不是实际对象的地址。无论哪种方式,尝试访问未初始化的指针值都是未定义的行为,就像在该地址处有一个对象一样。

因此,您的编译器通过发出警告(不需要这样做)帮助您,因为您的代码具有未定义的行为。

  

那么这个问题有一个简单的解决方法吗?

在解除引用之前,将指针设置为指向有效对象。如果你不这样做,那么就没有关于你的程序会有什么行为的承诺。

答案 1 :(得分:3)

而不是

int *num; // num points to somewhere random
*num = 25; // writing somewhere random makes zero sense
           // and if your OS allowed you to do it, you would
           // crash your computer very often.

你必须写

int num = 25;
int *pnum = &num; // pnum is a pointer to int which has been
                  // initialized with the address of num

同样的事情适用于struct的内容。

答案 2 :(得分:1)

C4700不是错误。点。但MSVC无法在C4700上编译,这是一个错误,因为“/ sdl”编译器开关默认打开 C4700 discution on visualstudio siteMSDN /sdl switch for vs 2012+