【问题标题】:Dynamic memory allocation for integer pointer整数指针的动态内存分配
【发布时间】:2019-06-24 02:08:29
【问题描述】:

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

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

根据我的理解,上述代码应该返回分段错误,这发生在我的电脑(Ubuntu 32 位)中。

但是同一段代码,在我的 MacOS 和 Fedora Linux 系统上执行时,输出为“value = 5”。任何想法,为什么这段代码在这两个系统上工作,即使我没有为整数指针分配内存?

【问题讨论】:

  • “未定义行为”与“分段错误”不同。
  • 好吧,既然代码中没有动态分配或其他分配,不清楚为什么这个问题是关于“动态内存分配”的。
  • “代码应该返回分段错误”,就像说如果你在测试中作弊你应该被抓住。也许你会,也许你不会。如果您需要一种语言来告诉您代码何时被骗,请考虑使用其他语言。 C 根本不需要这样做。

标签: c dynamic-memory-allocation


【解决方案1】:

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

未初始化的指针可能指向某些您可以读写的内存。写入此地址可能会更改不相关的数据或可能会更改程序的机器代码,并可能在以后导致崩溃或奇怪的行为。行为未定义,当您修改程序的不相关部分时可能会发生变化。

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

【讨论】:

    【解决方案2】:

    我认为,每当您必须以代码 sn-p 的方式处理内存时,您就进入了未定义行为的领域。您的指针可能已随机初始化为有效的内存位置,因此分配将起作用。如果你想测试一个 100% 的机会失败,你应该将 a 初始化为 NULL

    【讨论】:

      【解决方案3】:

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

      这就是为什么它在一个系统上“工作”但在另一个系统上崩溃的原因。仅仅因为你做了一些可能导致崩溃的事情并不意味着它

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 1970-01-01
        • 2019-07-12
        • 2015-02-05
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多