一个C语言编译器内部BUG(Gcc):主函数调用任意循环报段错误Segmentation fault

代码描述:一个用于计算哈夫曼树编码的C语言,如下:

#include<stdio.h>
#include<string.h>
#include<malloc.h>
 
typedef struct
{   int weight;
    int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;

void Select(HTNode HT[],int len,int &s1,int &s2)//选出权值最小的两个结点,下标通过s1和s2传出去
{
    int i,min1=32767,min2=32767;
    for(i=1;i<=len;i++)
    {
        if(HT[i].weight<min1&&HT[i].parent==0)
        {
            s2=s1;
            min2=min1;
            min1=HT[i].weight;
            s1=i;
        }
        else if(HT[i].weight<min2&&HT[i].parent==0)
        {    min2=HT[i].weight;
            s2=i;
        }
    }
}
void CreateHuffman_tree(HuffmanTree &Ht,int n);/*建立哈夫曼树*/
void Huffman_code(HuffmanTree HT,HuffmanCode &HC,int n);/*哈夫曼树编码*/
void show(HuffmanTree HT,HuffmanCode HC,int n);
 
int main()
{
    HuffmanTree HT;
    HuffmanCode HC;
    int i, n;
    scanf("%d",&n);
    CreateHuffman_tree(HT, n);/*建立哈夫曼树*/
    Huffman_code(HT,HC,n);/*哈夫曼树编码*/
    show(HT,HC,n);
    return 0;
}

void show(HuffmanTree HT,HuffmanCode HC,int n)
{
    for(int i=1;i<=n;i++)/*输出字符、权值及编码*/
       printf("编码是:%s\n",HC[i]);
}

 
void CreateHuffman_tree(HuffmanTree& HT, int n)
{
    int s1=0;
    int s2=0;
    HT = (HuffmanTree)malloc(sizeof(HTNode)*(2*n));
    for (int i = 1; i <=n ; ++i) {
        scanf("%d",&HT[i].weight);
    }
    for (int i = 1;i<=2*n-1;i++) 
    {
    	HT[i].parent =0;
    	HT[i].lchild =0;
    	HT[i].rchild =0;
	}
	for (int i=n+1;i<=2*n-1;i++)
    {
		Select(HT,i-1,s1,s2);
		HT[i].lchild  =s1;
		HT[i].rchild  =s2;
		HT[s1].parent =i; 
	    HT[s2].parent =i;
		HT[i].weight =HT[s1].weight+HT[s2].weight ;
	}
}
void Huffman_code(HuffmanTree HT, HuffmanCode &HC, int n) {
	char tmp[n];
    //HC = (char **)malloc(n*sizeof(char *));
	tmp[n-1] = '\0';
	int start, c, f;
	for(int i = 1; i <= n; i++) {
		start = n - 1;
		c = i;
		f = HT[i].parent;
		while(f){
			if(HT[f].lchild == c)
				tmp[--start] = '0';
			else
				tmp[--start] = '1';
			c = f;
			f = HT[f].parent;
		}
		HC[i] = (char *)malloc((n-start)*sizeof(char));
		strcpy(HC[i], &tmp[start]);
	}
}

细心的小伙伴已经发现我注释了第78行,

//HC = (char **)malloc(n*sizeof(char *));

正常情况是可以运行的,如图

但是如果在主函数加上任意的循环,包括for循环或者while循环,那么就会报错,且报错不在主函数。

当把注释取消,问题解决。

猜测是因为没有初始化HC变量(二级指针)溢出导致的,由于我没有学过汇编所以对该情况感到很困惑,望大佬解答。

总结:这是一个在代码没有按照要求初始化的情况出现的bug,来源于编译器本身,代码规范很重要,有时候代码不规范也能跑,但C没有官方的编译器,不同的C编译器可能给出不同的结果或者不符合预期。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值