哈夫曼编码(Huffman Coding)参数传递错误排查求助
问题原因分析
1. 指针值传递的特性导致修改无法回传
C语言函数参数默认是值传递,HTree本质是Node*指针类型。当你在main中将ht传给CreateHTree时,函数会创建一个ht的副本,函数内部对这个副本的任何修改(比如分配内存)都不会影响main里的原指针变量。
2. 未初始化的野指针问题
main里的HTree ht;仅声明了指针变量,但未分配内存或初始化,此时ht是野指针。直接传递这种指针到函数中操作,不仅无法完成正确的参数传递,还会引发未定义行为(比如程序崩溃)。
3. 函数参数设计不符合内存分配需求
如果CreateHTree需要为哈夫曼树分配内存,并让main里的ht指向这块内存,函数参数需要设计为指针的指针(即HTree*,等价于Node**),这样才能在函数内部修改原指针的指向。
修正方案示例
调整函数声明与调用方式:
// 修改函数参数为指针的指针 void CreateHTree(HTree *ht, int n) { // 为哈夫曼树分配2n-1个节点的内存 *ht = (HTree)malloc((2 * n - 1) * sizeof(Node)); // 后续节点初始化、构建哈夫曼树的逻辑... } int main() { int n; scanf("%d", &n); HTree ht = NULL; // 初始化指针为NULL char **hc; // 传递ht的地址,让函数能修改原指针 CreateHTree(&ht, n); print(ht,n); // 使用完后释放内存 free(ht); return 0; }
内容的提问来源于stack exchange,提问作者Sparashy
相关产品推荐
相关产品推荐

