在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()
。