gpt4 book ai didi

c - 另一个函数中的空闲内存

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

所以我有这段代码,其中分配发生在一个函数中,而释放是在调用函数中完成的。尝试通过 ptr 或 *ptr 释放内存时收到段错误或中止消息。请看一下:

#include <stdio.h>

int main()
{

char *ptr;
fun(&ptr);
printf("ptr = %p\n",ptr);
printf("&ptr = %p\n",&ptr);
printf("String ptr = %s\n",ptr);
free (ptr);

return 0;
}
void fun(char **str)
{
*str = malloc(10);
*str = "HELLO";
printf("str = %p\n",str);
printf("&str = %p\n",&str);

printf("String str = %s\n",*str);
}

输出如下:

str = 0x7ffe63247858                                                                                                                 
&str = 0x7ffe63247838
String str = HELLO
ptr = 0x400764
&ptr = 0x7ffe63247858
String ptr = HELLO
*** Error in `/home/a.out': munmap_chunk(): invalid pointer: 0x0000000000400764 ***
Aborted

问题:

为什么我们不能释放 ptr ?如果可以,最好的方法是什么?

最佳答案

您将在后面的行中覆盖指针值,使 *str 指向文字。

所以你有一个内存泄漏试图释放一个文字的未定义行为。

你可能是说

strcpy(*str,"hello");

请注意,这两行可以像这样更改为一个有效的单行:

*str = strdup("HELLO");

它的优点是可以为字符串分配准确的字节数而不是猜测。

关于c - 另一个函数中的空闲内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48660376/

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