我正在编写一个从用户读取多个输入行的小程序:
#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;
}
我的问题是关于malloc()
中readlines(char**,int,size_t)
的来电。我显然不能free()
函数内存以便在程序结束时释放它,我试图循环遍历char*
数组并单独释放它们。然后,我还在char** buffer
中免费main()
,因为它也是使用malloc()
分配的。
循环遍历每一个都会给我一个错误:
object was probably modified after being freed.
最后释放char** buffer
正常。
所以似乎有一个动态记忆的概念我不太了解。为什么会发生这种情况以及在这个特定程序中处理内存的正确方法是什么?
答案 0 :(得分:2)
问题是您正在通过运行buffer++
来修改缓冲区指针,因此当您调用free(buffer)
时,您传入了错误的指针。您可以重写循环以不修改该指针。