#include <stdio.h>
int main(void){
char *temp = malloc(11);
strcpy(temp, "123456789");
free(temp);
printf("%cn", *temp);
return 0;
}
在上面的代码中,为什么我不因访问尚未分配的内存而出现分段错误。打印出来的字符是空的?不应该是1吗?
添加一个元素来@I3x答案。
例如,与取消引用 NULL 不同,从同一进程中取消引用来自 malloc 的地址 - 即使该地址刚刚被释放 - 也是从进程的虚拟地址空间中取消引用地址,该地址在进程之前对进程可见。因此,在这种情况下,触发段错误的可能性较小。
但是,在自由运行之后,操作系统认为该内存段未使用,准备再次分配,甚至立即由内存分配系统本身使用。这可能就是为什么您在免费发生后在该位置获得不同值的原因。
该段可能分配给另一个进程,或者对最初分配它的进程不可用,从而触发页面错误 => 段错误。
无论如何,没有理由"欺骗"系统试图继续使用已返回操作系统的内存区域。
再重复一遍:"相似"意味着未定义的行为。你可能没有得到一个段错误,你可能会得到一个。字节可以更改,也可能不会更改。但是,无论如何,该内存在空闲后不再可用。完全。别这样。
一旦你free()
指针temp
,它的值是不确定的。访问它是未定义的行为。无法保证未定义的行为会导致分段错误。