c++ - 为什么未初始化的内存位置的值是-842150451?
问题描述
我在搞乱内存分配。我正在测试看到,就像 Java 一样,这个程序给出了一个异常。
int main() {
int* a = nullptr;
int b = *a;
std::cout << b;
}
确实如此。然后我测试了 usingmalloc
作为指向 的指针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
是 value 的二进制补码表示0xCDCDCDCD
,它是堆分配的未初始化内存的常见 Visual Studio 调试器值。
从 C++ 规范的角度来看,未初始化的变量或内存具有不确定的值,使用这些值会导致未定义的行为。如果你记得这一点,并且总是初始化这样的值或内存,那么你会没事的。
推荐阅读
- sql - 选择分区键的位置太慢,Spark Sql 有限制
- amazon-s3 - 如何在 Minio 上找到 SignatureDoesNotMatch 错误的来源
- docker - FileNotFoundError:No such file or directory: 'config/endpoints.yml' while building Rasa using Docker
- java - 在链表中存储对象
- javascript - 错误 TS2678 类型“'String'”与角度 5 中的类型“'”''不可比较
- reactjs - 如何以更短的方式赋予多个属性以响应组件?
- r - 在数据框行上运行 purrr::map_dfr?
- reactjs - ReactJS 在父类中使用子道具
- mingw - 使用 MinGw 平台和 MPICH、fftw lapack 和 BLAS 等库为 windows 编译 linux 程序 (OpenMX)?
- c++ - 带有 g++ 编译器的 OpenGL C++,无法在 Windows 10 上找到 GLFW(没有 Visual Studio)