【问题标题】:Is it possible to free() a pointer returned by a function?是否可以释放()函数返回的指针?
【发布时间】:2015-11-24 09:26:17
【问题描述】:

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

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

【问题讨论】:

  • 你应该始终freemalloc (直接或间接)。您拨打malloc在哪里并不重要。
  • strncpy 会比 memcpy 更好地为您服务,因为您想一开始就退出 \0
  • @JoachimPileborg 确实,从实用或 C 标准的角度来看,在哪里都没有关系。然而,从程序设计的角度来看,这很重要!
  • @Cyber​​Spock strlen() 已经在字符串中找到了 '\0',难道 strncpy() 不是不必要的吗?鉴于我知道事物的确切大小(以字节为单位),memcpy() 似乎是最有效的方法。
  • @Roflcopter4 是的,你是对的

标签: c string pointers malloc


【解决方案1】:
return buf;

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

【讨论】:

  • 耶稣。我的脸现在真的红了。我盯着这东西看了大概 10 分钟,不知怎的错过了一些明显的东西。我认为也许在凌晨 3 点这样做并不是最好的主意。
【解决方案2】:

您没有返回 malloc()-ed 指针,而是返回了您的参数,因此这是您代码中的一个错误。

更一般地说,如果函数文档指定这样做是可以的,您只能free() 函数返回的指针。

【讨论】:

    【解决方案3】:

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

    return buf;
    

    作者:

    return str;
    

    您的 Segfault 源于您试图释放的指针不是您 malloc()-ed 的指针,而是只读字符串的参数。

    【讨论】:

    • 谢谢。从上面的答案中复制粘贴我的评论:“耶稣。我的脸现在真的红了。我盯着这个东西看了大约 10 分钟,不知何故错过了一些明显的东西。我认为也许在凌晨 3 点这样做并不是最好的主意。”
    【解决方案4】:

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

    【讨论】:

    • 谢谢。从上面的答案中复制粘贴我的评论:“耶稣。我的脸现在真的红了。我盯着这个东西看了大约 10 分钟,不知何故错过了一些明显的东西。我认为也许在凌晨 3 点这样做并不是最好的主意。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2013-10-20
    • 2012-08-07
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多