我正在学习和测试 C 中的内存分配,我想测试如果free()
叫做。
我预计可能存在分段错误或指针NULL
当我运行下面的程序后。但是,我仍然可以成功打印输出中的字符串。我也尝试过免费str
两次,然后输出 2 发生错误。
看起来之前分配的内存已经成功释放,但是内存上的数据没有清理干净。那是对的吗?如果是这样的话,程序什么时候会清理那些被释放的内存空间呢?如果数据被释放但没有清理干净,那安全吗?
以上任何问题的答案都会有帮助!谢谢!
Code
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello, World!\n");
char *str = (char *)malloc(24);
char *str2 = "tutorialspoint";
strcpy(str, str2);
free(str);
printf("[str] %s\n", str);
return 0;
}
Output
Hello, World!
[str] tutorialspoint
Output 2
main(83218,0x7fff9d2aa3c0) malloc: *** error for object 0x7fb0b2d00000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
Edit
谢谢大家的有用回复。现在我明白 C 中有一些未定义的行为(UB),这帮助我理解了之前让我困惑的其他事情,例如写入超出分配范围的字符串(如下面的代码片段中的内容)。这导致 UB 根据wiki,但程序不会崩溃。
如果我错了,请随时纠正我!
char *str = (char *)malloc(0);
char *str2 = "tutorialspoint";
strcat(str, str2);
printf("[str] %s, [addr] %p\n", str, str);