在函数内部使用malloc并返回本地指针

3
在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并返回局部变量是否存在问题。

4
没错,只需要确保有其他人调用free()函数。 - Code-Apprentice
1
在设计使用动态内存的新代码时,我总是让调用者发送动态内存分配,而不是在子程序中执行。 - Ryan
2
如果您正在使用Visual Studio,则必须确保对mallocfree的调用位于同一个DLL中。MS运行时库不喜欢在一个DLL中分配的内存在另一个DLL中释放。 - R Sahu
char *newstr = malloc(4 * sizeof *newstr); - Ryan Haining
3个回答

3

你返回的不是一个本地变量,而是返回了存储在本地变量中的

这段代码没问题(虽然在malloc上的强制类型转换是不必要的);在一个函数中分配内存,在另一个函数中释放内存是一种常见的模式。


2
这很完美,只要你非常确定调用方将免费调用以避免内存泄漏..这在小型程序上不是什么大问题,但当程序变得复杂时,相信我,你会关注比释放指针更多的事情..
但是(毫无疑问),标准C库本身使用了更加令人满意的解决方案。使用缓冲区!(鼓掌,鼓掌)
你知道,例如fgets函数要求你提供字符指针作为第一个参数的原因是它可以写入而不是返回malloc'd指针。
例如..
#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);
}

这样,您就不必担心以后如何处理变量了。
您把这个问题留给了函数调用者去处理。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接