求问一个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

不知怎么回事?
...全文
155 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
你的代码有越界写,破坏了“申请的内存的数据结构”,造成释放时失败。

70,022

社区成员

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

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