C 释放返回变量内存的正确方法
我创建了一个用于获取用户输入的函数。它要求将内存分配给保存用户输入的变量;但是,该变量在函数末尾返回。释放已分配内存/返回变量值的正确方法是什么 代码如下:C 释放返回变量内存的正确方法,c,memory,malloc,free,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; 我应该返回输入地址并在使用后
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] = '\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;
}
因为input+n
不是malloc()
返回的指针
但是,您的代码还有其他问题需要注意
MAX\u SIZE
char
s分配空间,因此您应该乘以sizeof(char)
,即1
,而不是sizeof(char*)
,后者将分配MAX\u SIZE
指针,您还可以将MAX\u SIZE
作为函数参数,因为如果要分配固定缓冲区,可以在main()
中定义一个数组,其大小为MAX\u size
类似char input[MAX\u size]
,并将其作为参数传递给readInput()
,从而避免malloc()
和free()
循环中的溢出当循环时,您应该验证i
您可以编写返回类型为
char*
的函数,返回input
,并要求用户在处理完数据后调用free
您还可以要求用户自己传入一个大小合适的缓冲区,以及缓冲区大小限制,并返回写入缓冲区的字符数。这是一个典型的c案例。函数为其结果占用内存,调用方必须释放返回值。您现在正走在c内存泄漏的薄冰上。2原因 第一,;您无法以可执行的方式传达自由需求(即编译器或运行时无法帮助您-与指定参数类型不同)。你只需要把它记录在某个地方,并希望打电话的人已经阅读了你的文档 第二:即使调用者知道要释放结果,他可能会犯错误,也会采取一些不会释放内存的错误路径。这不会立即导致错误,事情似乎正常,但运行3周后,你的应用程序在内存不足时崩溃
这就是为什么有这么多“现代”语言集中在这个话题上,C++智能指针,java,C等垃圾收集,……/p>如果你<代码> MalOC/<代码>,最终有人需要“<代码>免费>代码>,如果你在另一个API或调用方中。相关的,如果在您的目标平台上得到支持,POSIX.1-2008中添加的库函数似乎几乎可以实现您想要实现的功能。它仍然要求调用者最终
释放任何返回的分配,但也提供了重用语义,而您的代码没有这样做。根据预期用途和目标平台,这可能值得考虑。他不能使用本地数组,因为当它返回并且函数的堆栈帧被破坏时,将无法保证数组完好无损。编译器将给您一个警告:“函数返回局部变量[-Wreturn local addr]的地址”。除此之外,回答得很好。@EnzoFerber我的意思是将数组传递给函数并在那里填充,我知道不能返回本地数组。我想我需要澄清这一点。
free(input + n);