malloc配合使用free程序为什么会出错呢

liate1 2009-07-27 11:52:01
#include "stdio.h"
#include "stdlib.h"
void main()
{
int *b = NULL, i;

b = (int *)malloc(sizeof(int));
if(NULL == b)
return;
for(i = 0; i < 3; i++)
{
scanf("%d", b + i);
}

free(b);
}

为什么运行到free的时候程序会出错呢?麻烦各位帮忙看看谢谢
...全文
120 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nio96 2009-07-27
  • 打赏
  • 举报
回复
hehe
ies_sweet 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]
因为你的指针 b已经变了而位置。不再是刚分配时的内存地址。
[/Quote]

貌似b的值没有改变,还是指向了开始申请的那块长度为sizeof(int)的内存吧~
liyudefly 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]
sanf了三次?
b+2还需要能用?

那需要b = (int *)malloc(sizeof(int)*3);
[/Quote]

正解
飞天御剑流 2009-07-27
  • 打赏
  • 举报
回复
代码改为这样:


int * Temp;
.........
b = (int *)malloc( sizeof( int ) * 3 );
if(NULL == b) return;
Temp = b;
for(i = 0; i < 3; i++)
scanf("%d", b + i);
free( Temp );
pengzhixi 2009-07-27
  • 打赏
  • 举报
回复
因为你的指针 b已经变了而位置。不再是刚分配时的内存地址。
ies_sweet 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]
sanf了三次?
b+2还需要能用?

那需要b = (int *)malloc(sizeof(int)*3);
[/Quote]

的确,你只申请了一个int的空间
b[0]是合法的
b[1], b[2]都已经越界了
内存越界后果是不堪设想的
givenup 2009-07-27
  • 打赏
  • 举报
回复
按照1楼的方法就可以了。
mstlq 2009-07-27
  • 打赏
  • 举报
回复
sanf了三次?
b+2还需要能用?

那需要b = (int *)malloc(sizeof(int)*3);
kojie_chen 2009-07-27
  • 打赏
  • 举报
回复
原来是越界的问题

69,371

社区成员

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

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