是否可以 free() 函数返回的指针?

Is it possible to free() a pointer returned by a function?

这个问题过去可能已经回答过(很多次),但我通过搜索找不到任何这样的答案。无论如何,这是一个非常菜鸟的问题。

我创建了一个小函数(粗略地)执行非标准 GCC 函数 strdup() 的操作。您将一个字符串传递给它,它会检查大小,为新字符串分配足够的内存,然后 returns 它(或 NULL)。但是,无论出于何种原因,我似乎无法在调用函数中释放该指针。我在运行时遇到段错误或 "invalid pointer" 错误。

我怀疑问题仅仅是因为我试图释放的指针与最初发送给 malloc 的指针不同,这可以通过传递双指针轻松解决到函数并让它分配新字符串给它,而不是 return 任何东西,但让我困惑的是我可以成功释放指针 return 由 "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("%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)
return buf;

你应该return str,指向你刚刚分配的内存的指针。

是的,这是可能的。如果指针指向的内存是通过 malloc 系列函数分配的,则可以从函数中释放指针 returned。
在您的情况下,您应该 return str 而不是 buff

您没有 return malloc() 编辑的指针,您 return 您的论点,所以这是您代码中的错误。

更一般地说,如果函数文档指定可以这样做,则您只能 free() 指针 return 由函数编辑。

在你的函数 strdup2 中你应该改变:

return buf;

作者:

return str;

你的段错误来自于你试图释放一个指针,这个指针不是你malloc()编辑的指针,而是一个只读字符串的参数。