我自己修改了一个HUFFMAN编码的C程序,执行通过,无任何错误。“搬”到MFC,用Edit接收字符串,再编码,可以执行,结果也正确,可是,系统提示有内存错误。请问,怎么解决????平台:Win2000 Server
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>struct HTNode
{
    int weight;
    int parent;
    int lChild;
    int rChild;
};
HTNode* HT;
int LookFor(char letter,int count);
void GetWeight();
void HuffmanCoding();
void Select(int step);
char* Data="abbcccddddeeeee12121212121fsdfdfsaddsadsdsewrewrewewrewew";
int Length=0;
int AllCount=0;
char* Letter="";
int* LetterCount;
char** HC;
char* Code="";
int s1=0;
int s2=0;void main()
{
GetWeight();
HuffmanCoding();
//Translate();
printf("index letter weight parent lchild rchild code\n");
for(int i=1;i<=AllCount;i++)
{
printf("%d %c %d %d %d %d  %s\n",i,Letter[i-1],HT[i].weight,HT[i].parent,HT[i].lChild,HT[i].rChild,HC[i]);
}
}void GetWeight()
{
Length=strlen(Data);
Letter=(char*)malloc(Length);
LetterCount=(int*)malloc(Length);
    int Index;
for(int i=0;i<Length;i++)
{
if(i==0)
        {
            Letter[0]=Data[i];
            LetterCount[0]=1;
            AllCount++;
        }
else
{
Index=LookFor(Data[i],AllCount);
if(Index==-1)
{
Letter[AllCount]=Data[i];
LetterCount[AllCount]=1;
AllCount++;
}
else
{
LetterCount[Index]++;
}
}
}
Letter[AllCount]='\0';
}int LookFor(char letter,int count)
{
for(int i=0;i<count;i++)
{
if(Letter[i]==letter)
return i;
}
return -1;
}void HuffmanCoding()
{
if(AllCount<=1) return;
HT=(HTNode*)malloc((2*AllCount)*sizeof(HTNode*));
HT[0].weight=0;
HT[0].lChild=0;
HT[0].rChild=0;
HT[0].parent=0;
for(int i=1;i<=AllCount;i++)
{
HT[i].weight=int(1000*float(LetterCount[i-1])/float(Length));
HT[i].lChild=0;
HT[i].rChild=0;
HT[i].parent=0;
}
for(i=AllCount+1;i<=2*AllCount-1;i++)
{
HT[i].weight=0;
HT[i].lChild=0;
HT[i].rChild=0;
HT[i].parent=0;
}
for(i=AllCount+1;i<=2*AllCount-1;i++)
{
        //Select(i-1,&s1,&s2);
Select(i);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lChild=s1;
HT[i].rChild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
//从叶子逆向遍历Huffman树
int start;
int c;
    int f;
char* cd;
HC=(char**)malloc((AllCount+1)*sizeof(char*));
    cd=(char*)malloc(AllCount*sizeof(char));
    cd[AllCount-1]='\0';
    for(i=1;i<=AllCount;++i)
    {
        start=AllCount-1;
        for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
        {
            if(HT[f].lChild==c)
                cd[--start]='0';
            else
                cd[--start]='1';
HC[i]=(char*)malloc((AllCount-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
        }
    }
}void Select(int step)
{
int weight=9999;
int i;
if(step==AllCount+1)//如果是第一次构造,找出最小和次小
{
for(i=1;i<=AllCount;i++)
{
if(HT[i].parent==0&&HT[i].weight<=weight)
{
weight=HT[i].weight;
s1=i;//s1为最小
}
}
weight=9999;
for(i=1;i<=AllCount;i++)
{
if(i!=s1&&HT[i].parent==0&&HT[i].weight<=weight)
{
weight=HT[i].weight;
s2=i;//s2为次小
}
}
}
else   //如果不是第一次构造,找剩下的最小值
{
for(i=1;i<=AllCount;i++)
{
if(HT[i].parent==0&&HT[i].weight<=weight)
{
weight=HT[i].weight;
s1=i;//s1为最小
}
}
s2=step-1;
}
}

解决方案 »

  1.   

    void HuffmanCoding()
    {
    if(AllCount<=1) return;
    HT=(HTNode*)malloc((2*AllCount)*sizeof(HTNode*));
    ......其中"HT=(HTNode*)malloc((2*AllCount)*sizeof(HTNode*))"
    怎么是"sizeof(HTNode*)"?
    应当是HT=(HTNode*)malloc((2*AllCount)*sizeof(HTNode))"吧?
      

  2.   

    "sizeof(HTNode*)"=4
    楼上是对的
      

  3.   

    改了,不行,请问哪位大虾在MFC中经常使用数据结构做东东的?指点一二,而且我还怀疑了是Win2000的内存管理问题,于是又在Win98中编译执行,能得到正确,但还是总来个内存错误。是不是malloc哪里有问题