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



在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] = '';
    return newstr;
}

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

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

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

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

但是,标准的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: %snLower Version: %sntTada !n", s, lower_version);
}

这样,您就不必担心在以后的使用中如何处理该变量。。
您将把这个问题留给函数调用方来处理。

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

相关内容

  • 没有找到相关文章