C语言中内存动态分配应注意的问题

本文详细介绍了在Linux环境下使用C语言编写上位机程序时,如何正确管理动态分配的内存,避免内存冲突和释放错误的问题。通过分析两个常见错误场景,提出了解决方案并总结了最佳实践。

最近在校给老师做项目,写一个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,所以释放时会出错。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值