You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

修正说明

  1. 结构体简化:将二级指针改为一级指针,直接存储动态数组首地址,符合动态数组常规用法,降低复杂度。
  2. 参数传递修正:polyInput改为接收结构体指针,确保内存分配和赋值直接作用于主函数的结构体变量,避免值传递的拷贝失效问题。
  3. polySum逻辑修复:
    • 删除导致无限递归的错误代码;
    • 修正系数赋值的笔误;
    • 修正条件判断的下标错误;
    • 补充处理poly2剩余项的循环;
    • 按需分配内存,用n1+n2作为最大容量,避免固定值50的局限性。
  4. 内存管理:添加free操作,释放所有动态分配的内存,避免内存泄漏。

内容的提问来源于stack exchange,提问作者crazyCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:04:56