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

大数计算器程序内存泄漏排查求助(附Valgrind报告及代码)

大数计算器问题求助

我完成了大学作业中的大数计算器程序,仅支持+、-、*三种运算,但目前遇到两个明确问题:

  • scanBigNumber函数被Valgrind检测出存在4字节确定内存泄漏
  • 终端输入时必须额外按一次回车才能进入下一步计算

示例输入

例如输入运算式:12345678901234567890 + 98765432109876543210,输入完成后需多按一次回车才会触发计算逻辑

Valgrind检测报告

12345 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
12345 at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
12345 by 0x109234: scanBigNumber (calculator.c:45)
12345 by 0x109456: main (calculator.c:120)

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int *digits;
    int length;
    int sign; // 1表示正数,-1表示负数
} BigNumber;

BigNumber scanBigNumber() {
    BigNumber num;
    char input[1000];
    fgets(input, sizeof(input), stdin);
    
    // 处理符号
    num.sign = 1;
    int start = 0;
    if (input[0] == '-') {
        num.sign = -1;
        start = 1;
    } else if (input[0] == '+') {
        start = 1;
    }
    
    // 去掉末尾换行符
    input[strcspn(input, "\n")] = '\0';
    num.length = strlen(input) - start;
    
    // 分配内存存储数字
    num.digits = (int*)malloc(num.length * sizeof(int));
    if (num.digits == NULL) {
        fprintf(stderr, "内存分配失败\n");
        exit(1);
    }
    
    // 将字符转换为数字,逆序存储
    for (int i = 0; i < num.length; i++) {
        num.digits[i] = input[start + num.length - 1 - i] - '0';
    }
    
    return num;
}

BigNumber addBigNumber(BigNumber a, BigNumber b) {
    BigNumber res;
    res.length = a.length > b.length ? a.length : b.length;
    res.digits = (int*)malloc((res.length + 1) * sizeof(int));
    if (res.digits == NULL) {
        fprintf(stderr, "内存分配失败\n");
        exit(1);
    }
    
    int carry = 0;
    for (int i = 0; i < res.length; i++) {
        int digitA = i < a.length ? a.digits[i] : 0;
        int digitB = i < b.length ? b.digits[i] : 0;
        int sum = digitA + digitB + carry;
        res.digits[i] = sum % 10;
        carry = sum / 10;
    }
    
    if (carry != 0) {
        res.digits[res.length] = carry;
        res.length++;
    }
    
    res.sign = a.sign;
    return res;
}

// 减法、乘法函数实现省略

void printBigNumber(BigNumber num) {
    if (num.sign == -1) {
        printf("-");
    }
    for (int i = num.length - 1; i >= 0; i--) {
        printf("%d", num.digits[i]);
    }
    printf("\n");
}

void freeBigNumber(BigNumber num) {
    free(num.digits);
}

int main() {
    BigNumber num1, num2, result;
    char op;
    
    printf("请输入运算式(格式:数字 运算符 数字):\n");
    num1 = scanBigNumber();
    scanf(" %c", &op);
    num2 = scanBigNumber();
    
    switch(op) {
        case '+':
            result = addBigNumber(num1, num2);
            break;
        case '-':
            // 减法逻辑调用
            break;
        case '*':
            // 乘法逻辑调用
            break;
        default:
            fprintf(stderr, "不支持的运算符\n");
            freeBigNumber(num1);
            freeBigNumber(num2);
            exit(1);
    }
    
    printf("结果:");
    printBigNumber(result);
    
    freeBigNumber(num1);
    freeBigNumber(num2);
    freeBigNumber(result);
    
    return 0;
}

恳请帮忙排查这两个问题的根源并给出解决方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:02:33