c-是否可以释放()函数返回的指针



这个问题在过去可能已经被回答过(很多次),但我通过搜索找不到任何这样的答案。无论如何,这在很大程度上是一个棘手的问题。

我创建了一个小函数,它(粗略地)做非标准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

相关内容

  • 没有找到相关文章

最新更新