动态存储分配给整数指针

时间:2019-01-30 17:49:55

标签: c dynamic-memory-allocation

我有一个关于整数指针的动态内存分配的查询。

    int main()
    {
        int *a;
        *a = 5;
        printf("value = %d\n", *a);
        return 0;
    }

据我了解,以上代码应返回分段错误,该错误发生在我的PC(Ubuntu 32位)中。

但是,在我的MacOS和Fedora Linux系统上执行时,同一段代码的输出为“值= 5”。知道吗,即使我没有为整数指针分配内存,为什么这段代码也可以在这两个系统上运行?

3 个答案:

答案 0 :(得分:4)

当系统检测到您使用了错误的内存地址时,发生分段错误。显然,这在您的情况下不会发生。

未初始化的指针可能指向一些允许您读写的内存。写入该地址可能会更改不相关的数据,或者可能会更改程序的机器代码,并可能导致以后崩溃或奇怪的行为。该行为是不确定的,并且在修改程序的不相关部分时可能会更改。

要检查此类问题,可以使用valgrind之类的工具。

答案 1 :(得分:3)

我认为,只要您必须按照代码段的方式处理内存,便会进入未定义行为的领域。您的指针可能已被随机初始化为有效的内存位置,因此可以使用该提示。如果要测试100%机会失败,则应将a初始化为NULL

答案 2 :(得分:1)

取消引用未初始化的指针时,将调用undefined behavior。这意味着您无法预测程序的反应。它可能会崩溃,可能会输出奇怪的结果,或者它似乎可以正常工作。

这就是为什么它在一个系统上“起作用”但在另一个系统上崩溃的原因。仅仅因为您执行可能导致崩溃的操作,并不意味着它