为什么我的悬空指针不会导致分段错误?

时间:2013-12-21 21:23:06

标签: c segmentation-fault dangling-pointer

我的代码:

#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编译它

5 个答案:

答案 0 :(得分:12)

纯粹的运气。在这种情况下的行为是未定义。即:对于可能发生的事情没有任何期望。

答案 1 :(得分:3)

  

在我看来它应该不起作用[...]但是它有效。

别担心,它不起作用。

  

它应该导致分段错误

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

这是unfin行为的可能性

答案 4 :(得分:0)

在空闲前后显示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()没有为p指针赋值NULL,所以*p = 42;就像静态赋值一样,虽然它是未定义的行为。

建议使用免费宏:

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

使用此宏进行测试,您将看到预期的行为