如何使用未初始化的指针修复C++中的C4700警告
How to fix C4700 warning in C++ with uninitialized pointers?
我已经通读了之前关于C4700的许多帖子,但我似乎找不到解决问题的方法。
我写了一个小脚本来演示结构指针:
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,因此编译器错误消失了,但毫不奇怪,我得到了一个异常:
测试中0x00265DF7未处理的异常.exe: 0xC0000005:访问冲突写入位置0x00000000。
你看我一直认为,当我不初始化这些指针时,它们会自动用随机地址初始化(就像未初始化的整数/字符/双精度将被分配垃圾一样)——所以这里不应该是这样吗?
如果在这种情况下初始化确实是绝对必要的(为什么?),那么这个问题有没有一个简单的解决方法?
而不是
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 = # // pnum is a pointer to int which has been
// initialized with the address of num
同样的事情也适用于struct
的内容。
未初始化的变量不会初始化为随机值,而是未初始化的。在机器代码级别上,它们具有创建时存在的任何价值。这可能是也可能不是实际对象的地址。无论哪种方式,尝试访问未初始化的指针值都是未定义的行为,就好像该地址有一个对象一样。
因此,编译器通过发出警告(不需要这样做)来帮你一个忙,因为你的代码具有未定义的行为。
那么这个问题有没有简单的解决方法呢?
在取消引用之前,将指针设置为指向有效对象。如果你不这样做,那么就没有关于你的程序将具有什么行为的承诺。
C4700 不是错误。点。但是 MSVC 无法在 C4700 上编译,这是一个错误,因为"/sdl"编译器开关默认处于打开状态C4700 在可视化工作室网站上进行分配,MSDN/sdl 交换机与 2012+
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 文本文件中的单词链表
- 递归函数计算序列中的平方和(并输出过程)
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++中的"inline"关键字
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 用C++中的一个变量定义一个常量
- vector.resize()中的分配错误
- 使用指针从C++中的数组中获取最大值
- arr[-1]在c++中的奇怪行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 将值指定给向量(2D)的向量中的某个位置
- 内置函数可查看CPP中的成员变量