我一直试图对shannon-fano压缩进行编码,我认为我陷入了内存分配。它进入函数的第二次迭代,然后在
处崩溃 nod *node=new nod;
node->st=new nod;
node->st->st=NULL;
node->st->dr=NULL;
此函数应该使用Divide et Impera创建二叉树,但第一次调用 shannonFano(n-> st,begin); 时会崩溃。我的假设是内存的分配是错误的。 班级点头 {char * info; int * pondere; int val; struct nod * st,* dr;
void shannonFano(nod *n, int dim)
{
if (dim>1)
{
int begin=0;
int end=dim;
int b_sum=n->pondere[0];
int e_sum=n->pondere[dim];
nod *node=new nod;
node->st=new nod;
node->st->st=NULL;
node->st->dr=NULL;
node->dr=new nod;
node->dr->st=NULL;
node->dr->dr=NULL;
while (begin !=end-1)
{
if (b_sum > e_sum)
{end--;
e_sum=e_sum+n->pondere[end];
} else {
begin++;
b_sum=b_sum+n->pondere[begin];
}
}
strncpy(node->info,n->info,begin);
for (int i=0;i<begin;i++)
node->pondere[i]=n->pondere[i];
node->val=0;
n->st=node;
strncpy(node->info,&n->info[end],dim-end+1);
for (int i=end;i<dim;i++)
node->pondere[i]=n->pondere[i];
node->val=1;
n->dr=node;
shannonFano(n->st,begin);
shannonFano(n->dr,dim-end+1);
}
}
答案 0 :(得分:0)
我不确定你想做什么,但我看到了问题。根据您的格式,您希望每次执行for
循环后的三行,但只有第一行。您需要添加{}
。
答案 1 :(得分:0)
我真的看不到100%的代码,以及它是如何被执行的,所以如果我错了就不要对我大喊大叫,但这一行:
int e_sum=n->pondere[dim];
似乎很可疑。这个数组在哪里被分配?它的大小暗淡吗?如果是这样,最后一个元素将在
pondere[dim-1];
并使用dim中的值会导致未定义的行为,可能会导致程序崩溃。
此外,你的for循环后面没有括号,所以只有它们之后的第一行才能在循环中执行,而你的缩进建议你试图执行所有缩进的行(我相信每个3行)