我正在学习和测试C中的内存分配,我想测试free()调用时会发生什么.
我预计NULL在我运行下面的程序后可能会出现分段错误或指针.但是,我仍然可以像输出一样成功打印字符串.我也试图释放str两次,然后输出2发生错误.
似乎先前分配的内存已成功解除分配,但内存上的数据未被清除.那是对的吗?如果是这种情况,程序什么时候会清理那些解除分配的内存空间?如果数据被解除分配但没有清理,那是否安全?
上述任何问题的答案都会有所帮助!谢谢!
#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;
}
Run Code Online (Sandbox Code Playgroud)
Hello, World!
[str] tutorialspoint
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
谢谢大家的回复.现在我明白C中有一些未定义的行为(UB),这有助于我理解其他让我困惑的事情,例如写入超出分配范围的字符串(如下面的代码片段中的内容).这导致UB根据维基,但该程序不会崩溃.
如果我弄错了,请随意纠正我!
char *str = (char *)malloc(0);
char *str2 …Run Code Online (Sandbox Code Playgroud)