为什么未初始化的内存位置的值给出 -842150451 的值?
Why Is The Value Of An Uninitialized Memory Location Give The Value Of -842150451?
我在内存分配上搞砸了。我正在测试,看看像Java一样,这个程序有一个例外。
int main() {
int* a = nullptr;
int b = *a;
std::cout << b;
}
确实如此。然后我测试了使用malloc
作为指向a
的指针,但没有初始化 a。
int main() {
int* a = (int*) malloc(sizeof(int));
int b = *a;
std::cout << b;
}
但是,它不会抛出异常,而是在 -842150451 中打印出一个看似随机的数字。我什至尝试用 long 替换 int:
int main() {
long* a = (long*) malloc(sizeof(long));
long b = *a;
std::cout << b;
}
但是我得到了相同的结果。然后我用简短的尝试:
int main() {
short* a = (short*) malloc(sizeof(short));
short b = *a;
std::cout << b;
}
然后我得到了 -12851,而不是之前的结果。对于我能想到的每一种原始类型,它都继续这样。我想知道的是,这些数字来自哪里,为什么这些数字具体
?-842150451
是值0xCDCDCDCD
的二进制补码表示形式,这是堆分配的未初始化内存的常见Visual Studio调试器值。
从C++规范的角度来看,未初始化的变量或内存具有不确定的值,使用这些值会导致未定义的行为。如果你记得这一点,并且总是初始化这样的值或内存,那么你就会没事的。
所有的错误程序都有技术上称为未定义的行为。这意味着程序的行为不受C++标准的约束,因此在运行代码时期望任何特定结果都是错误的。
在这方面,C++与Java完全不同,Java为大多数情况指定了精确的行为。
相关文章:
- 数组索引的值没有增加
- 'short int'持有的值溢出,但"自动"不会溢出?
- 是默认情况下分配给char数组常量的值
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 为什么我无法更改"set<set>"循环中的值<int>
- 有效地使用std::unordered_map来插入或增加键的值
- <streamsize>C++ 中 numeric_limits::max() 的值
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 无法获取webot::PositionSensor对象中位置传感器的值
- 正在将无序映射设置为无序映射的值
- 着色器纹理值与创建纹理时写入的值不同
- 无法按cpp中的值返回矢量
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何在c++中获取要更新的值
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 为什么未初始化的内存位置的值给出 -842150451 的值?