所以我有这个代码,在一个函数中进行分配,并在调用函数中进行解除分配。在尝试通过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?如果可以的话,最好的方法是什么?
答案 0 :(得分:6)
您将覆盖后面一行中的指针值,使*str
指向文字。
通过尝试free
一个文字,你有一个内存泄漏和未定义的行为。
你可能意味着
strcpy(*str,"hello");
请注意,这两行可以更改为工作单行,如下所示:
*str = strdup("HELLO");
,其优点是为字符串分配确切的字节数而不是猜测。
答案 1 :(得分:1)
执行*str = "HELLO";
时,它没有您期望的效果。您不是将值分配给已分配的内存,而是重新指定指向字符串文字的指针,因此稍后您尝试释放它(因此错误)。除此之外,您应该使用strcpy
之类的strcpy(*str, "HELLO")
。
答案 2 :(得分:0)
要回答如何在没有明确字符串复制的情况下执行此操作的问题,而不是
char *p = "hello";
DO
char p[] = "hello";
第一点指向不可修改的内存部分。第二个分配一个足够大的数组来保存文字并将文字复制到其中。
答案 3 :(得分:0)
你正在改变malloc之后的内存地址指向str指针。你应该做strcpy而不是直接赋值:
#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);
strcpy(*str,"HELLO");//*str = "HELLO";
printf("str = %p\n",str);
printf("&str = %p\n",&str);
printf("String str = %s\n",*str);
}