s)引起的,其中p_current_item是链表中的节点,s是它包含的char*。我通过调用方法 add-6ren">
gpt4 book ai didi

c - 为什么在使用 "Quotes"创建 char* 时不需要释放内存

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:41 24 4
gpt4 key购买 nike

我在测试一些代码时遇到了一个可怕的错误。我发现是调用free(p_current_item->s)引起的,其中p_current_item是链表中的节点,s是它包含的char*。我通过调用方法 addItem(node,char*) 创建节点,该方法只是将元素添加到列表中:p_head=addItem(p_head,"this gets added");困扰我的是:

1) 为什么我需要释放元素中包含的字符串。我知道当 s 被声明为 char* s = snprintf(s,(size_t),30,"this gets added"); 时是必要的(这在我的类示例中是如何完成的)但为什么这是必要的 - 是否有可能在结构本身被释放时释放结构(在本例中为 linkedList 节点)中包含的属性?

2) 当我试图释放显式声明的 s 的值时发生了什么

3) 我是否需要通过其他方式释放 s 的值?

谢谢:-)

最佳答案

您只能释放使用malloc调用系列分配的内存。

用双引号括起来的字符串是编译时常量。它们与指令文本一起导入到您的运行时程序中。因此那些没有被动态分配。

此外,snprintf 返回生成的字符串的长度,而不是指向它的指针。正确的用法是:

size_t length = snprintf(s,(size_t)30,"this gets added");

1) 如果 s 是使用 malloccalloc 或来自该系列的其他调用分配的,则只需要释放 s。例如char* s = malloc(1024);

2) free("constant string"); 充其量会导致分段冲突,因为您正在尝试释放尚未由 malloc 分配的内存电话的家庭。通常这是未定义的行为。

3) 你不需要释放常量字符串,它们是你文本的一部分,即使你想释放也不能释放。

关于c - 为什么在使用 "Quotes"创建 char* 时不需要释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12842030/

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