为什么未初始化的内存位置的值给出 -842150451 的值?

Why Is The Value Of An Uninitialized Memory Location Give The Value Of -842150451?

本文关键字:-842150451 的值 位置 初始化 内存 为什么      更新时间:2023-10-16

我在内存分配上搞砸了。我正在测试,看看像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为大多数情况指定了精确的行为。