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

时间:2014-09-02 21:49:29

标签: c return malloc dynamic-memory-allocation

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分: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);
}

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