0

我的代码:

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

4

5 回答 5

13

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

于 2013-12-21T21:24:06.057 回答
3

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

别担心,它不起作用。

它应该导致分段错误

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

于 2013-12-21T21:24:35.917 回答
1

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

于 2013-12-21T21:31:25.447 回答
0

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

这是未定义行为的可能性

于 2013-12-21T21:26:17.940 回答
-1

您在 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;尽管它是未定义的行为,但它像静态分配一样工作。

建议使用免费宏:

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

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

于 2013-12-21T22:45:55.337 回答