小编Pet*_*aul的帖子

我释放后仍然可以打印一个字符串?

我正在学习和测试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)

输出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
Run Code Online (Sandbox Code Playgroud)

编辑

谢谢大家的回复.现在我明白C中有一些未定义的行为(UB),这有助于我理解其他让我困惑的事情,例如写入超出分配范围的字符串(如下面的代码片段中的内容).这导致UB根据维基,但该程序不会崩溃.

如果我弄错了,请随意纠正我!

char *str = (char *)malloc(0);
char *str2 …
Run Code Online (Sandbox Code Playgroud)

c malloc free memory-management

6
推荐指数
2
解决办法
888
查看次数

标签 统计

c ×1

free ×1

malloc ×1

memory-management ×1