w m*_*w m 15 c memory malloc free
我创建了一个旨在获取用户输入的函数.它要求将内存分配给保存用户输入的变量; 但是,该函数在函数结束时返回.释放已分配内存/返回变量值的正确方法是什么?
这是代码:
char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;
while((c = getchar()) != '\n' && c != EOF) {
input[i++] = c;
}
return input;
Run Code Online (Sandbox Code Playgroud)
我应该返回输入地址并在使用后将其释放吗?
对于释放输入变量的最合适方法感到好奇.
Iha*_*imi 16
它很简单,只要你传递给它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] = '\0'; /* 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: %s\n", input);
/* now you can free it */
free(input);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你永远不应该做的事情是这样的
free(input + n);
Run Code Online (Sandbox Code Playgroud)
因为input + n
不是指针返回malloc()
.
但是您的代码还有其他问题需要注意
您分配的空间MAX_SIZE
char
这么你应该乘sizeof(char)
哪是1
的,而不是sizeof(char *)
这将分配MAX_SIZE
指针,你也可以做MAX_SIZE
一个函数的参数代替,因为如果你分配一个固定的缓冲区,你可以在定义数组main()
与大小MAX_SIZE
一样char input[MAX_SIZE]
,并将其传递给readInput()
参数,从而避免malloc()
和free()
.
你正在分配那么多空间,但是你不能阻止while
循环中的溢出,你应该验证它i < MAX_SIZE
.
这是一个经典的c案例。函数为其结果分配内存,调用者必须释放返回值。您现在正走在 c 内存泄漏的如履薄冰之上。2个原因
第一的 ; 您无法以可执行的方式传达自由要求(即编译器或运行时无法帮助您 - 与指定参数类型相反)。您只需将其记录在某处并希望调用者已阅读您的文档
其次:即使调用者知道要释放结果,他也可能会犯错误,但会采取一些不会释放内存的错误路径。这不会立即导致错误,一切似乎都正常,但运行 3 周后,您的应用程序会因内存不足而崩溃
这就是为什么这么多“现代”语言都关注这个主题,C++ 智能指针、Java、C# 等垃圾收集,...
您可以编写一个返回类型为char*
return的函数input
,并要求用户在free
处理完数据后调用。
您还可以要求用户自己传入一个适当大小的缓冲区,连同缓冲区大小限制,并返回写入缓冲区的字符数。