gpt4 book ai didi

释放后还能打印字符串吗?

转载 作者:太空狗 更新时间:2023-10-29 14:54:39 28 4
gpt4 key购买 nike

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

输出

Hello, World!
[str] tutorialspoint

输出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

编辑

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

如果我说错了,请随时纠正我!

char *str = (char *)malloc(0);
char *str2 = "tutorialspoint";
strcat(str, str2);
printf("[str] %s, [addr] %p\n", str, str);

最佳答案

您需要了解未定义行为的概念。

即使您在释放字符串后打印该字符串并且它“有效”,也不意味着它有效。这只是当行为被称为未定义时可能发生的事情之一,在这种情况下是这样。

另外,指针不会是NULL除非你这样做

free(ptr);
ptr = NULL;

free(),也不会将所有字节设置为0

free() 函数就像它的名字所暗示的那样。它允许 malloc() 再次使用 free()d block 。指针指向的数据可能仍然没有改变,这就是为什么你仍然可以在 free() 之后打印之前的内容的原因。但是,如果您在 free() 之后取消引用指针,或者数据是否仍然存在,或者是否被完全或部分覆盖,则绝对不能保证会发生什么。

如果您在使用 free() 之后取消引用指针,那么您确实知道一件事,即行为未定义。

关于释放后还能打印字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45198752/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com