这个问题在过去可能已经被回答过(很多次),但我通过搜索找不到任何这样的答案。无论如何,这在很大程度上是一个棘手的问题。
我创建了一个小函数,它(粗略地)做非标准GCC函数strdup()所做的事情。您向它传递一个字符串,它检查大小,为新字符串分配足够的内存,并返回它(或NULL)。然而,无论出于何种原因,我似乎都无法释放调用函数中的指针。我在运行时遇到seg错误或"无效指针"错误。
我怀疑这个问题只是因为我试图释放的指针与最初发送给malloc的指针不一样,而且通过向函数传递双指针并让它为其分配新字符串,并且根本不返回任何内容,可以很容易地解决这个问题,但让我困惑的是,我可以成功地释放"official"strdup()函数返回的指针,而不会出现任何问题。什么东西?
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strdup2(char *buf);
int main()
{
char *str1, *str2;
str1 = strdup("This is the first test!");
str2 = strdup2("This is the second test!");
printf("%sn%sn", str1, str2);
free(str1);
puts("First pointer successfully freed.");
free(str2);
puts("Second pointer successfully freed.");
return 0;
}
char *strdup2(char *buf)
{
size_t len = strlen(buf)+1;
char *str = malloc(len);
if (str == NULL)
return NULL;
memcpy(str, buf, len);
return buf;
}
运行时,我得到:
This is the first test!
This is the second test!
First pointer successfully freed.
zsh: segmentation fault (core dumped)
return buf;
您应该返回str
,它是指向刚刚分配的内存的指针。
您不返回malloc()
-ed指针,而是返回参数,因此它是代码中的一个错误。
更一般地说,如果函数文档指定可以这样做,则只能free()
函数返回的指针
在函数strdup2中,您应该更改:
return buf;
发件人:
return str;
Segfault的原因是您试图释放一个指针,该指针不是您malloc()
所创建的指针,而是一个只读字符串的参数。
是的,这是可能的。如果指针指向的内存是通过malloc
族函数分配的,则可以释放从函数返回的指针
在您的情况下,您应该返回str
而不是buff