【问题标题】:Why my dangling pointer doesn't cause a segmentation fault?为什么我的悬空指针不会导致分段错误?
【发布时间】:2014-01-10 12:01:03
【问题描述】:

我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = (int *)malloc(sizeof(int));
    free(p);
    *p = 42;
    return 0;
}

我创建了一个指针,然后我将它指向分配的空间,最后我为它分配了 42。 在我看来它不应该工作,它应该导致分段错误,但它工作。 那么,为什么?

PS:我通常在 Linux 上使用 Gcc 编译它

【问题讨论】:

标签: c segmentation-fault dangling-pointer


【解决方案1】:

纯属运气。这种情况下的行为是undefined。即:不能对可能发生的事情做出任何预期。

【讨论】:

    【解决方案2】:

    在我看来,它不应该起作用 [...] 但它起作用了。

    别担心,它不起作用。

    应该会导致分段错误

    告诉 C 标准委员会。这只是未定义的行为,不需要崩溃。

    【讨论】:

      【解决方案3】:

      “未定义”之外的更详细的答案是,只要您留在进程分配的内存区域内,您就可以写入 C 中的任意内存位置。根据操作系统,可能允许或不允许覆盖代码。只有在您的进程的其他一些代码被乱码内存位置的内容弄糊涂时,才会出现不良影响。由于你的程序在弄乱内存后立即退出,它的某些代码混淆的机会显然很小。

      【讨论】:

        【解决方案4】:

        这种情况下的行为是未定义的,

        这是一种未定义行为的可能性

        【讨论】:

          【解决方案5】:

          你在free检查“p”前后显示p的内存地址:

          #include <stdio.h>
          #include <stdlib.h>
          
              int main(void) {
                  int *p = (int *)malloc(sizeof(int));
                   printf("before \n %p \n",p);
                   free(p);
                  *p = 42;
                   printf("after\n %p \n",p);
                   printf(" %d \n",*p);
                  return 0;
              }
          

          在 free 之前和之后,我们拥有相同的地址内存,因为 free() 不会将 NULL 分配给 p 指针,因此 *p = 42; 像静态分配一样工作,尽管它是未定义的行为。

          建议使用 FREE 宏:

          #define FREE(X) \
          free(X);\
          X=NULL;
          

          用这个宏测试,你会看到预期的行为

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-18
            • 2013-10-25
            • 2011-11-22
            • 1970-01-01
            • 2021-08-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多