为何基础除法函数会触发Segmentation fault (core dumped)?如何修复?
整数除法程序的段错误问题分析与修复
错误原因分析
你的代码存在多个问题,直接导致了段错误和编译警告:
- 函数定义位置非法:C标准不允许在
main函数内部嵌套定义division函数,这属于语法违规,会引发编译警告。 scanf传参错误:当分母为0进入循环后,scanf("%i", denominator);把denominator的数值(此时是0)当作内存地址传给scanf,写入这个无效地址直接触发段错误。- 指针操作错误:函数内
dividend = numerator/denominator;是把整数赋值给指针变量本身,而非通过指针修改外部的结果变量,正确的操作应该是解引用指针:*dividend = ...。 - 函数调用传参类型不匹配:
division(n, d, *dvd, *rmn);传递的是指针指向的整数值,但函数要求的是int*类型的参数,应该直接传递指针变量dvd、rmn,或者变量地址&den、&rem。 - 函数返回值缺失:
division声明返回int,但函数内没有return语句,引发编译警告。
修复后的代码
#include <stdio.h> // 将division函数移到main外部 void division(int numerator, int *denominator, int *dividend, int *remainder) { // 循环检查分母,通过指针修改外部传入的分母变量 while (*denominator == 0) { printf("Number cannot be 0!\n"); printf("Enter another number: "); // 传入分母变量的地址,确保修改生效 scanf("%i", denominator); } // 解引用指针,将结果写入外部变量 *dividend = numerator / *denominator; *remainder = numerator % *denominator; printf("%i/%i = %i with %i remainder\n", numerator, *denominator, *dividend, *remainder); } int main(int argc, char const *argv[]) { int n, d, den, rem; printf("Enter the numerator: "); scanf("%i", &n); printf("%i\n", n); printf("Enter the denominator: "); scanf("%i", &d); printf("%i\n", d); // 传递分母的地址,确保函数能修改d的值;传递结果变量的地址用于存储计算结果 division(n, &d, &den, &rem); return 0; }
关键修复说明
- 把
division函数移到main函数外部,符合C语法规范。 - 修改
division的参数,将denominator改为指针类型,这样函数内可以直接修改外部输入的分母变量,确保重新输入的非零值能被后续计算使用。 - 修正
scanf的传参,直接传递denominator指针(也就是外部变量d的地址),避免写入无效地址。 - 对
dividend和remainder指针进行解引用操作,将计算结果写入外部的den和rem变量中。 - 函数调用时传递变量的地址,保证参数类型匹配。
- 将
division的返回类型改为void,因为不需要返回值,消除返回值缺失的警告。
内容的提问来源于stack exchange,提问作者user17267060
相关产品推荐
相关产品推荐

