【问题标题】:Using malloc inside a function and return local pointer在函数中使用 malloc 并返回本地指针
【发布时间】:2014-10-27 06:47:38
【问题描述】:

在C中做这样的事情有什么问题吗

char* wrap(char *inp) {
    char *newstr;
    newstr = (char *)malloc( sizeof(char) * 4);
    newstr[0] = 'A';
    newstr[1] = inp[0];
    newstr[2] = 'B';
    newstr[3] = '\0';
    return newstr;
}

基本上我想知道在函数中使用 malloc 并返回局部变量是否有问题。

【问题讨论】:

  • 不。请确保其他人致电free()
  • 在设计使用动态内存的新代码时,我总是让调用者发送动态内存分配,而不是在子例程中进行。
  • 如果您使用的是 Visual Studio,您必须确保对 mallocfree 的调用在同一个 DLL 中。 MS 运行时库不喜欢在一个 DLL 中分配的内存在另一个 DLL 中释放。
  • char *newstr = malloc(4 * sizeof *newstr);

标签: c return malloc dynamic-memory-allocation


【解决方案1】:

这很完美,只要你非常确定调用者会免费调用以避免内存泄漏.. 这对小程序来说不是什么大问题,但是当程序变得复杂时,相信我,你会关心更多的事情,而不是从一个自包含的函数中释放一个指针..

但是(放下手),标准 C 库本身使用了一个更令人满意的解决方案。使用缓冲区! (鼓掌,鼓掌)

你知道,例如 fgets 函数要求你提供一个字符指针作为第一个参数是有原因的,这样它就可以写入它而不是返回一个 malloc 的指针..

例如..

#include <ctype.h>
#include <string.h>

void toLower(char *buf, const char *s) {
    for(int i = 0; s[i]; ++i)
        buf[i] = tolower(s[i]);
}
int main(int argc, const char ** argv) {
    const char *s = "ThAt'S a BiG sTrIng";
    char lower_version[strlen(s)];
    toLower(lower_version, s);
    printf("Original Version: %s\nLower Version: %s\n\tTada !\n", s, lower_version);
}

这样,您不必担心在以后的使用中将如何处理变量..
您将此问题留给函数调用者处理。

【讨论】:

    【解决方案2】:

    你没有返回一个局部变量;您正在返回存储在局部变量中的 value

    这段代码很好(尽管malloc 上的强制转换是不必要的);在一个函数中分配内存并在另一个函数中释放它是一种常见的模式。

    【讨论】:

      【解决方案3】:

      只要您在某处调用free() 以避免内存泄漏,这完全没问题。您的程序设计的一部分应该定义每个指针的“所有者”。这种所有权可以转移,因此您应该在指针的整个生命周期内跟踪所有者。指针未使用时的所有者应负责调用free()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-13
        • 1970-01-01
        • 2017-07-05
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多