C语言指数形式多项式相加代码出现段错误,请求修正
C语言多项式相加代码段错误的问题分析与修正
核心错误点
- 结构体值传递导致参数失效:
polyInput函数采用值传递接收polynomial结构体,函数内对poly.expo和poly.coff的修改仅作用于局部拷贝,主函数中的poly1、poly2指针成员始终是未初始化的野指针,后续访问必然触发段错误。 - 不必要的二级指针设计:结构体中使用
int **expo和int **coff完全多余,动态存储多项式的指数和系数仅需一级指针int*即可,二级指针徒增复杂度且易引发野指针访问。 - polySum函数的致命逻辑错误:
- 开头的
if语句后直接执行return polySum(poly2, poly1);,无终止逻辑导致无限递归,最终栈溢出触发段错误; - 存在笔误:
(*sumOfPoly.coff)[k] = (*poly2.expo)[j];将指数错误赋值给系数; - 条件判断
else if (*poly1.expo[i] > *poly2.expo[i])中把j写成i,逻辑完全错误。
- 开头的
- 未初始化指针的非法访问:
polySum中sumOfPoly的expo和coff是未初始化的二级指针,直接解引用*sumOfPoly.coff进行malloc操作,属于非法访问野指针。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> // 简化结构体,用一级指针存储动态数组 typedef struct Polynomial { int numTerms; int *expo; int *coff; } polynomial; // 传递结构体指针,确保修改作用于主函数的结构体 void polyInput(polynomial *poly) { int i; poly->expo = (int *)malloc(sizeof(int) * poly->numTerms); poly->coff = (int *)malloc(sizeof(int) * poly->numTerms); printf("Enter the pair of exponent and coefficient:\n"); for (i = 0; i < poly->numTerms; i++) { scanf("%d %d", &poly->expo[i], &poly->coff[i]); } } void polyPrint(polynomial poly) { int i; for (i = 0; i < poly.numTerms; i++) { printf("(%d, %d) ", poly.expo[i], poly.coff[i]); } } polynomial polySum(polynomial poly1, polynomial poly2) { int n1 = poly1.numTerms; int n2 = poly2.numTerms; int i = 0, j = 0, k = 0; polynomial sumOfPoly; // 按需分配内存,用n1+n2确保能存储所有项 sumOfPoly.expo = (int *)malloc(sizeof(int) * (n1 + n2)); sumOfPoly.coff = (int *)malloc(sizeof(int) * (n1 + n2)); while (i < n1 && j < n2) { if (poly1.expo[i] > poly2.expo[j]) { sumOfPoly.expo[k] = poly1.expo[i]; sumOfPoly.coff[k] = poly1.coff[i]; k++; i++; } else if (poly1.expo[i] < poly2.expo[j]) { sumOfPoly.expo[k] = poly2.expo[j]; sumOfPoly.coff[k] = poly2.coff[j]; k++; j++; } else { // 系数和不为0才保留项 if (poly1.coff[i] + poly2.coff[j] != 0) { sumOfPoly.expo[k] = poly1.expo[i]; sumOfPoly.coff[k] = poly1.coff[i] + poly2.coff[j]; k++; } i++; j++; } } // 处理poly1剩余项 while (i < n1) { sumOfPoly.expo[k] = poly1.expo[i]; sumOfPoly.coff[k] = poly1.coff[i]; k++; i++; } // 处理poly2剩余项(原代码遗漏) while (j < n2) { sumOfPoly.expo[k] = poly2.expo[j]; sumOfPoly.coff[k] = poly2.coff[j]; k++; j++; } sumOfPoly.numTerms = k; return sumOfPoly; } int main() { polynomial poly1, poly2, sumOfPoly; printf("Enter the number of terms in 1st polynomial: "); scanf("%d", &poly1.numTerms); polyInput(&poly1); printf("Enter the number of terms in 2nd polynomial: "); scanf("%d", &poly2.numTerms); polyInput(&poly2); sumOfPoly = polySum(poly1, poly2); printf("Sum of polynomials: "); polyPrint(sumOfPoly); // 释放动态分配的内存,避免泄漏 free(poly1.expo); free(poly1.coff); free(poly2.expo); free(poly2.coff); free(sumOfPoly.expo); free(sumOfPoly.coff); return 0; }
修正说明
- 结构体简化:将二级指针改为一级指针,直接存储动态数组首地址,符合动态数组常规用法,降低复杂度。
- 参数传递修正:
polyInput改为接收结构体指针,确保内存分配和赋值直接作用于主函数的结构体变量,避免值传递的拷贝失效问题。 - polySum逻辑修复:
- 删除导致无限递归的错误代码;
- 修正系数赋值的笔误;
- 修正条件判断的下标错误;
- 补充处理poly2剩余项的循环;
- 按需分配内存,用
n1+n2作为最大容量,避免固定值50的局限性。
- 内存管理:添加
free操作,释放所有动态分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者crazyCoder
相关产品推荐
相关产品推荐

