关于malloc函数 内存溢出的问题,求大神指点一下

[复制链接]
查看11 | 回复4 | 2021-1-27 06:26:13 | 显示全部楼层 |阅读模式
程序:
#include
#include

structstudent{
charname[6];
charxiaoname[6];
};
typedefstructstudentstudents;
voidadd_list(students*s1);
intmain()
{
studentss1;
add_list(&s1);

printf("%s.\n",s1.name);
system("pause");
return0;
}
voidadd_list(students*s1)
{
s1=(students*)malloc(sizeof(students));//请问这里怎么发生内存溢出了。能不能指点下这里。
gets_s(s1->name);
gets_s(s1->xiaoname);
}
我感觉思路完全正确啊,怎么结果不对头U啊,到网上查了一下没看懂。
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:26:13 | 显示全部楼层
不是malloc溢出,而是你gets_s的时候输入的字符超过6个了吧,缓冲越界
回复

使用道具 举报

千问 | 2021-1-27 06:26:13 | 显示全部楼层
你malloc的时候不一定成功,要判断下,而且每malloc一次要记得free一下
回复

使用道具 举报

千问 | 2021-1-27 06:26:13 | 显示全部楼层

studentss1;
//s1分配于栈上,已经不需要为其分配内存了。
add_list(&s1);//这里传递的是对象s1的地址,add_list是值调用,这里会有一个临时对象也就是
相当于代码:
registerstudents*tmp=&s1;
add_list(tmp);
所以add_list函数中不应该再分配内存。
s1=(students*)malloc(sizeof(students));//请问这里怎么发生内存溢出了。能不能指点下这里。
//这行应该不会发生内存溢出。从上面代码看,这行不需要存在。
//这里是存在内存泄露,也就是函数执行完成后,分配的内存地址将被丢弃,再也无法回收这块内存了。
//反而是下面两句需要确保不溢出。
gets_s(s1->name);
gets_s(s1->xiaoname);
你给namexiaoname的只有6个字节,所以不能超过5个字符,否则溢出(注意字符串结束符)。
回复

使用道具 举报

千问 | 2021-1-27 06:26:13 | 显示全部楼层
楼上正解,NND论坛不足6个字符不让提交反馈。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行