一个程序VC++可以编译通过,但是运行的时候内存出错?

来源:百度知道 编辑:UC知道 时间:2024/06/09 03:38:24
构造哈夫曼树:
#include <stdio.h>
#include <string.h>
#define N 50
#define M 2*N-1
typedef struct
{
char data[5];
int weight;
int parent;
int lchild;
int rchild;
}HTNode;
typedef struct
{
char cd[N];
int start;
}HCode;

void CreateHT(HTNode ht[],int n)
{
int i,k,lnode,rnode;
int min1,min2;
for(i=n;i<2*n-1;i++)
ht[i].parent=ht[i].lchild=ht[i].rchild=1;
for(i=n;i<2*n-1;i++)
{
min1=min2=32767;
lnode=rnode=-1;
for(k=0;k<=i-1;k++)
if(ht[k].parent==-1)
{
if(ht[k].weight<min1)
{
min2=min1;rnode=lnode;
min1=ht[k].weight;lnode=k;
}
else if(ht[k].weight<min2)
{
min2=ht[k].weight;rnode=k;
}
}
ht[lnode].parent=i;ht[rnode].parent=i;
ht[i].weight=ht[lnode].weight+ht[rnode].weight;
ht[i].l

那是因为你从来没有初始化或者给ht[0].parent赋值,然后在下面又引用了此ht[0].parent来作为数组下标,结果倒置边界溢出
for(i=0;i<n;i++)
{
hc.start=n;c=i;
f=ht[i].parent;
while(f!=1)
{
if(ht[f].lchild==c)

/*没仔细看*/
HTNode ht[M];
HCode hcd[N];
/*先清零*/
memset(ht,0,sizeof(ht));
memset(hcd,0,sizeof(hcd));
/*溢出了吧,把堆栈改大点,或把M改小点*/
/*结构体成员,合理赋初值*/

同志,有点建设性好不好,在那里出的错,单步调试就可以出来了!