最近在校给老师做项目,写一个Linux下上位机的C语言程序,由于上位机内存有限,所以临时字符串都用malloc进行动态分配,然后再用free对内存进行释放。刚开始写的过程中对数据栈没有过多考虑导致了程序接二连三的出错。在此将经验写下,以防日后忘记。
char *line;
char *buf;
FILE *fp;
buf = malloc(MAXLEN);
line = malloc(MAXLINE);
fp = fopen("test", "r");
while(fgets(line, MAXLINE, fp) != NULL)
{
strcat(buf, line);
}
fclose(fp);
...
...
free(line);
free(buf);
1、fgets(line, MAXLINE, fp) :由于我们是先对字符串line进行内存分配,然后再对buf进行分配。Linux下一般使用从低向高分配,所以buf到line之间只有MAXLEN个字节,而执行strcat(buf,line)函数,会使buf的内存增大,当buf内存大于MAXLEN时将抢占了line的内存,因此执行fgets(line,MAXLINE,fp)时就会出错。
2、free(buf):刚开始以为将buf和line分配内存的顺序颠倒下buf内存就可以不受限制的增长了,可是当执行free(buf)时,由于buf刚开始分配的内存只有MAXLEN,而现在其内存已经超过了MAXLEN,所以释放时会出错。