为什么会出现这样的内存分配错误??molloc()函数问题?

xianbin 2001-08-25 01:22:52
各位大虾,小弟最近碰到了一个大难提,至今仍未能理解,请各位帮帮小弟。

我是用的编译器是Turbo C 2.0 系统环境是Windows2000下的MS-DOS模式。

问题是这样的:我使用fprint()函数存放了一个字符串,然后关闭文件。接着,我使用fscanf()函数读取文件中的内容,经过单步执行,以确认读入的数据正确,然后开始分配内存给链表指针data。问题就在这里,我分配给data的内存地址(data=(struct string *)malloc(sizeof(struct string));与读出的链表地址中的某个节点的地址一致!这是为什么?当我插入数据的时候,当然,data中的新数据也就覆盖了原链表中相同地址的那个节点的数据,天!这是怎么回事啊?
...全文
83 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
QXLEE 2001-08-25
  • 打赏
  • 举报
回复
能不能详细一点?
movingboy 2001-08-25
  • 打赏
  • 举报
回复
你如果能看看Effective C++的Item 3的话,或许会有启发。摘录部分如下:
malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。

假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new:

string *stringarray1 =
static_cast<string*>(malloc(10 * sizeof(string)));

string *stringarray2 = new string[10];

其结果是,stringarray1确实指向的是可以容纳10个string对象的足够空间,但内存里并没有创建这些对象。而且,如果你不从这种晦涩的语法怪圈(详见条款m4和m8的描述)里跳出来的话,你没有办法来初始化数组里的对象。换句话说,stringarray1其实一点用也没有。相反,stringarray2指向的是一个包含10个完全构造好的string对象的数组,每个对象可以在任何读取string的操作里安全使用。

注意static_cast做的工作与你做的强制转换类似。

sim 2001-08-25
  • 打赏
  • 举报
回复
你的愿程序

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧