C 为什么free不释放内存?

C 为什么free不释放内存?,c,embedded,C,Embedded,我是C语言的新手,我尝试用Malloc动态分配内存,然后用“free”释放内存 我曾经尝试过在谷歌上搜索,但由于我刚刚开始学习,到目前为止还没有意义 #包括 #包括 int main(){ printf(“输入您的姓名:”); //这里我为“sir”数组分配了足够的内存。 //分配内存 char*sir=(char*)malloc(100*sizeof(char)); //扫描字符串。我正在扫描一个名称,例如:John Smith scanf(“%[^\n]”,先生); //先生的尺寸 int

我是C语言的新手,我尝试用Malloc动态分配内存,然后用“free”释放内存

我曾经尝试过在谷歌上搜索,但由于我刚刚开始学习,到目前为止还没有意义

#包括
#包括
int main(){
printf(“输入您的姓名:”);
//这里我为“sir”数组分配了足够的内存。
//分配内存
char*sir=(char*)malloc(100*sizeof(char));
//扫描字符串。我正在扫描一个名称,例如:John Smith
scanf(“%[^\n]”,先生);
//先生的尺寸
int size=strlen(sir);
printf(“字符串大小,strlen=%d\n”,大小);
//打印字符串
对于(int i=0;i
我希望在空闲(sir)行之后,我试图访问的内存为空/不可访问

我理解错了吗

提前谢谢。

这是未定义的行为。调用
free
后,指针仍将指向同一地址。对
malloc
的另一个调用现在可能会使用释放的内存,否则该内存将被保留。但是,如果尚未向该地址写入任何内容,则其内容仍然相同,并且由于指针仍指向该地址,因此可以打印字符串。通常,
free
用于内存管理,而不是将内存设置为任何值

在实际代码中永远不要这样做,免费后使用是一个巨大的安全风险


编辑:澄清一下,您可能根本无法访问内存,即使没有写入任何内容。同样,事先也没有办法知道。

当你卖掉房子搬出去时,你不一定要清理它。它确实会释放内存,因此可以(或不可以)随时重复使用。它不清除内容,因为这是C不需要的开销。访问空闲内存会产生不可预测的行为,因此这种情况在你的情况下会发生,在其他人的情况下,使用相同的代码可能会以完全不同的方式中断。你理解错了,是的。您的期望并不是不合理的,但是对于O/S来说,让现在释放的内存不可访问的代价太高了,所以它只是被标记为空闲。现在你不再拥有它,它可能会有其他微妙的变化,但默认情况下它不是禁区。建设性评论,但免费不会破坏我的房子?免费的是所有权,而不是内存,它可能仍然可以访问,也可能无法访问。因此,为了覆盖该内存,我应该分配另一块内存,并用新内容覆盖它。另外,free只释放内存,而不是清除/删除其内容,这些内容可以随时访问,对吗?再次使用
malloc
并不意味着您将获得相同的内存块。您可以使用已有的指针,使用类似于
memset
的内容覆盖内容。另外,如果内存的所有权发生变化,您将无法再访问它。正如我所说,这种行为完全没有定义,无法知道会发生什么。