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

为何基础除法函数会触发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;
}

关键修复说明

  1. 把division函数移到main函数外部,符合C语法规范。
  2. 修改division的参数,将denominator改为指针类型,这样函数内可以直接修改外部输入的分母变量,确保重新输入的非零值能被后续计算使用。
  3. 修正scanf的传参,直接传递denominator指针(也就是外部变量d的地址),避免写入无效地址。
  4. 对dividend和remainder指针进行解引用操作,将计算结果写入外部的den和rem变量中。
  5. 函数调用时传递变量的地址,保证参数类型匹配。
  6. 将division的返回类型改为void,因为不需要返回值,消除返回值缺失的警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:26:13