我正在编写一个小程序,它可以读取用户的多个输入行:
#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)
时,您传递了错误的指针。您可以重写循环以不修改该指针。