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



我的代码:

#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标准委员会。它只是未定义的行为,不需要崩溃。

除了"undefined"之外,更详细的答案是,只要您保持在进程分配的内存区域内,您就可以写入 C 中的任意内存位置。根据操作系统的不同,可能允许也可能不允许覆盖代码。只有在进程的其他一些代码被乱码内存位置发现的内容混淆时,不良影响才会出现。由于您的程序在弄乱内存后会立即退出,因此其某些代码混淆的可能性显然很小。

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

这是不确定行为的可能性

在自由检查"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("aftern %p n",p);
         printf(" %d n",*p);
        return 0;
    }

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

建议使用免费宏:

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

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

相关内容

  • 没有找到相关文章

最新更新