我创建了一个旨在获取用户输入的函数。它要求将内存分配给保存用户输入的变量;但是,该变量在函数结束时返回。释放分配的内存/返回变量值的正确方法是什么?
这是代码:
char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;
while((c = getchar()) != 'n' && c != EOF) {
input[i++] = c;
}
return input;
我是否应该返回输入的地址并在使用后释放它?
好奇释放输入变量的最合适方法。
这很简单,只要你传递给free()
malloc()
返回的相同指针
例如
char *readInput(size_t size)
{
char *input;
int chr;
input = malloc(size + 1);
if (input == NULL)
return NULL;
while ((i < size) && ((chr = getchar()) != 'n') && (chr != EOF))
input[i++] = chr;
input[size] = ' '; /* nul terminate the array, so it can be a string */
return input;
}
int main(void)
{
char *input;
input = readInput(100);
if (input == NULL)
return -1;
printf("input: %sn", input);
/* now you can free it */
free(input);
return 0;
}
你永远不应该做的是这样的事情
free(input + n);
因为input + n
不是指针返回malloc()
。
但是你的代码,还有其他你应该处理的问题
您正在为
MAX_SIZE
char
s 分配空间,因此您应该乘以sizeof(char)
哪个是1
,而不是sizeof(char *)
会分配MAX_SIZE
指针,您也可以MAX_SIZE
函数参数代替,因为如果您要分配固定缓冲区,您可以在main()
中定义一个大小MAX_SIZE
的数组,如char input[MAX_SIZE]
, 并将其作为参数传递给readInput()
,从而避免malloc()
和free()
。您正在分配那么多空间,但不能防止
while
循环中溢出,您应该验证该i < MAX_SIZE
。
你可以编写一个返回类型为 char*
的函数,返回 input
,并要求用户在完成数据处理后调用free
。
您还可以要求用户自己传入适当大小的缓冲区以及缓冲区大小限制,并返回写入缓冲区的字符数。
这是一个经典的 c 案例。函数会为其结果分配内存,调用方必须释放返回的值。您现在正走在 c 内存泄漏的薄冰上。2 个理由
首先;你没有办法以可执行的方式传达自由需求(即编译器或运行时不能帮助你 - 与指定参数类型相反)。您只需要将其记录在某个地方,并希望来电者已阅读您的文档
第二:即使调用方知道释放结果,他可能会犯错误,也会采取一些错误路径,而不会释放内存。这不会立即导致错误,一切似乎正常,但是在运行 3 周后,您的应用程序在内存不足后崩溃
这就是为什么这么多"现代"语言关注这个主题,C ++智能指针,Java,C#等垃圾回收,...