我在这个C程序中是否正确地释放了内存



我正在编写一个小程序,它可以读取用户的多个输入行:

#include <stdio.h>
#include <stdlib.h>
#define MAXINPUT 256
#define MAXLINES 32
/* Reads at most maxLines inputs from stdin. Returns number of lines. */
int readlines(char** buffer, int maxLines, size_t maxInput);
/* Gets input from stdin with maxInput as the limit. Returns size of string. Terminates at newline. */
int getstdline(char* buffer, int maxInput);
int main(int argc, char** argv) {
char** buffer = malloc((sizeof buffer[0]) * MAXLINES);
int numlines = readlines(buffer, MAXLINES, MAXINPUT);
/* free memory that was allocated for each str */
for(int i = 0; i < numlines; ++i) {
free(*(buffer++));
}
/* free memory that was allocated to hold all the strings */
free(buffer);
}
int readlines(char** buffer, int maxLines, size_t maxInput) {
int linecount = 0;
while(maxLines--) {
char* tmp = malloc(maxInput);
/* if empty string, exit loop */
if(getstdline(tmp, maxInput) <= 0) {
free(tmp);
break;
}
*buffer = tmp;
++linecount;
++buffer;
}
return linecount;
}

我的问题是关于在readlines(char**,int,size_t)中呼叫malloc()。很明显,我无法free()函数中的内存,所以为了在程序结束时释放它,我尝试循环使用char*数组并单独释放它们。然后我还在main()中释放char** buffer,因为它也是使用malloc()分配的。

循环浏览它们中的每一个都会给我一个错误:

object was probably modified after being freed.

在结束时释放char** buffer效果良好。

因此,我似乎不太理解动态记忆的概念。为什么会发生这种情况,在这个特定程序中处理内存的正确方法是什么?

问题是您通过运行buffer++来修改缓冲区指针,因此当您调用free(buffer)时,您传递了错误的指针。您可以重写循环以不修改该指针。

相关内容

  • 没有找到相关文章

最新更新