求问一个VC6.0环境下释放内存问题

lei001 2011-06-20 12:52:46


VC6.0环境下,编写一段代码如下

#include "stdio.h"

void *input_data(int *num)
{
int n,i,j,tmp;
int *p;

scanf("%d",&n);

p = malloc(n*n);

for(i=0; i<n;i++)
{
for(j= 0; j<n; j++)
{
scanf("%d",&tmp);
*(p+i*n+j) = tmp;
}
}

*num = n;
return p;
}

void print_data(int num, int *p)
{
int i,j;

for(i= 0; i<num;i++)
{
for(j=0;j<num;j++)
{
printf("%d ",*(p+i*num+j));
}
printf("\n");
}
}

void main()
{
int *p =NULL,*q = NULL;
int num = 0;
int i,j;

p = input_data(&num);

if(p!=NULL)
print_data(num, p);

if(p!=NULL)
free(p); //这一步释放内存有问题
}

free(p); 释放内存时,提示
“debug error!
Program:D:\debug\s.exe
DAMAGE:after Normal block(#43) at 0x003707B8

不知怎么回事?
...全文
127 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-06-20
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
就想叫yoko 2011-06-20
  • 打赏
  • 举报
回复
5楼正解
malloc的时候n*n还要*上sizeof(int)
AnYidan 2011-06-20
  • 打赏
  • 举报
回复
设断点,看看分配的指针和你释放时有何不同
ryfdizuo 2011-06-20
  • 打赏
  • 举报
回复
void *input_data(int *num)
{
int n,i,j,tmp;
int *p;

scanf("%d",&n);

p = malloc(n*n); //p = (int*)malloc(n*n* sizeof(int));

for(i=0; i<n;i++)
{
for(j= 0; j<n; j++)
{
scanf("%d",&tmp);
*(p+i*n+j) = tmp;
}
}

*num = n;
return p;
}
pwxcomer 2011-06-20
  • 打赏
  • 举报
回复
貌似p =malloc(n*n);也会有编译错误吧,我觉得应该是 p =(int*)malloc(n*n);
pwxcomer 2011-06-20
  • 打赏
  • 举报
回复
input_data函数貌似是返回一个空指针,但是p是指向整形变量的指针。 p = input_data(&num);会编译出错的……
5t4rk 2011-06-20
  • 打赏
  • 举报
回复
看看LZ
Proteas 2011-06-20
  • 打赏
  • 举报
回复
你的代码有越界写,破坏了“申请的内存的数据结构”,造成释放时失败。
VC++6.0车牌识别系统 需要注意的地方: 使用VC++6.0做开发工具, 采用简单的SDI框架结构 ,一次处理一幅位图(有兴趣的可以作成MDI) 1)位图信息的数据是从左下往右下为一行,一行一行往上排的。 2)每行像素应该是4的倍数,不足的地方用空点补齐,读的时候注意跳过冗余点。 3)主要数据都存在Doc里面,BMP的主要数据存在一个由ImgData指向的BYTE型的内存空间(根据位图的大小,动态分配的)。 4)数据读进来以后,注意向内存中贴图,以保证刷新的效率。 5)程序执行流程 应用程序生成--》打开--》CDipView的OnFileOpen 函数--》 调用CDipDoc的FileOpen 函数--》并使用myDoc->UpdateAllViews(NULL); 刷新 自动调用CDipView的OnPaint函数--》调用CDipView的OnDraw函数----一个像素点一个像素点的画 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 比较重要的地方 读BMP文件,只能打开256色 (可以是灰度) 显示和内存贴图技术 关于调色板: 调色板实际上是一个数组,4个BYTE 分别是 B,G,R,和 Reserved 每一个像素点都有一个相应的数组。 关于VC和windows 的绘图机制: 使用GDI(图形设备接口)对象,通常使用CDC 类,CPaintDC也一样(device-context)设备上下文 windows下的MFC编程机制,消息驱动,事件等待! 全局的app(应用程序对象) 注意 手工分配内存的清除 和CDC对象的删除 以释放系统的GDI资源 每一个new操作符都要对应一个delete 虽然已经弄出来了,还是希望大家好好读读源程序。 你们以后的工作: 在菜单中添加菜单项,通过ClassWizzard 生成消息响应函数(当然也可手动添加), 所有的操作应当是对 BYTE* ImgData;进行的。 在完成相应的功能后 将 isnewfile 和 isnewiamge 置为真 ,并使用myDoc->UpdateAllViews(NULL); 刷新 当然,可以更加有个性化一点,有能力的同学可以自己完成。 随着课程的进行,菜单功能逐渐丰富,最后完成基本的数字图像处理的功能,而不必最后一下完成一个大的作业。

69,374

社区成员

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

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