我的代码:
#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编译它
答案 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;
使用此宏进行测试,您将看到预期的行为