大数计算器程序内存泄漏排查求助(附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
相关产品推荐
相关产品推荐

