过去这个问题很可能已被回答(很多次),但我无法通过搜索找到任何这样的答案。无论如何,这是一个非常小的问题。
我创建了一个小函数(粗略地)执行非标准GCC函数strdup()的功能。你传递一个字符串,它检查大小,为新字符串分配足够的内存,并返回它(或NULL)。但是,无论出于何种原因,我似乎无法在调用函数中释放该指针。我得到一个段错误或一个"无效指针"运行时出错。
我怀疑这个问题只是因为我试图释放的指针与最初发送给malloc的指针不同,并且可以通过传递双指针轻松修复到函数并让它为它分配新的字符串,而不是返回任何东西,但令我困惑的是,我可以成功地释放由"官方"返回的指针。 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("%s\n%s\n", 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)
答案 0 :(得分:6)
return buf;
你应该返回str
,指向刚刚分配的内存的指针。
答案 1 :(得分:2)
你没有返回malloc()
- ed指针,你返回你的论点,所以它是你代码中的错误。
更一般地说,如果函数文档指定可以执行此操作,则只能free()
函数返回的指针。
答案 2 :(得分:2)
在你的函数strdup2中你应该改变:
return buf;
by:
return str;
你的Segfault来自这样一个事实:你试图释放一个不是你malloc()
的指针,而是一个只读字符串的参数。
答案 3 :(得分:1)
是的,可能。如果指向的内存是通过malloc
族函数分配的,则可以释放从函数返回的指针
在您的情况下,您应该返回str
而不是buff