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

问题描述 投票:0回答:1

我在搞内存分配。我想测试一下,像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;
}

但结果还是一样 然后我又尝试用short代替。

int main() {
    short* a = (short*) malloc(sizeof(short));
    short b = *a;
    std::cout << b;
}

结果不是之前的结果,而是-12851。我想到的每个基元类型都是这样。我想知道的是,这些数字是怎么来的,为什么是这些数字?

c++ memory null malloc
1个回答
4
投票

-842150451 是值的二乘法表示。0xCDCDCDCD,这是Visual Studio调试器常用的堆分配的未初始化内存的值。

未初始化的变量或内存的值为 未定 值,从C++规范的角度来看,使用这样的值会导致 未定义行为. 如果你记住这一点,并且总是初始化这样的值或内存,那么你就会没事。


2
投票

你所有的错误程序在技术上都有所谓的? 未定义的行为. 这意味着程序的行为不受C++标准的限制,因此,当你运行你的代码时,期待任何特定的结果是错误的。

C++在这一点上与Java完全不同,Java为大多数情况规定了精确的行为。

© www.soinside.com 2019 - 2024. All rights reserved.