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

C语言SIGABRT错误排查:组合生成代码异常咨询

C语言SIGABRT错误解析及升序数字组合代码修复

SIGABRT错误是什么?

SIGABRT是Unix/Linux系统中的信号(编号6),通常由以下情况触发:

  • 程序主动调用abort()函数终止自身
  • 断言(assert())失败,系统自动触发abort()
  • 内存操作严重错误,比如重复释放内存(double free)、内存分配失败后非法访问,触发系统的错误检查机制

你的代码问题定位与修复

你的代码核心逻辑是生成升序数字组合,但存在未定义行为,在部分输入(如n=9)下可能触发SIGABRT,问题出在ft_inc函数对counter的赋值以及循环逻辑的边界处理:

问题1:ft_inc函数错误修改counter为n,导致潜在的数组越界风险

在ft_inc中,当index == n-1时,将*pCount设为index+1(即n),回到ft_print_combn的循环后,虽然会执行counter = counter -1回到n-1,但极端情况下可能导致访问未初始化的数组元素,触发栈内存破坏,最终引发SIGABRT。

问题2:ft_print_digits的逗号判断逻辑存在隐患

当前判断digits[0] != (10 -n)来决定是否输出逗号,虽然大部分情况正确,但逻辑不够严谨,无法准确识别所有场景下的最后一个组合。

修复后的代码

#include <unistd.h>

void ft_putchar(char c)
{
    write(1, &c, 1);
}

// 判断当前组合是否为最后一个
int is_last_combination(int n, int *digits)
{
    int i;
    i = 0;
    while (i < n)
    {
        if (digits[i] != (10 - n) + i)
            return 0;
        i++;
    }
    return 1;
}

void ft_print_digits(int n, int *digits)
{
    int counter;

    counter = 0;
    while (counter < n)
    {
        ft_putchar(digits[counter] + 48);
        counter++;
    }
    if (!is_last_combination(n, digits))
    {
        ft_putchar(',');
        ft_putchar(' ');
    }
}

void ft_inc(int n, int *digits, int *pCount)
{
    int index;

    index = *pCount;
    while (index < n - 1)
    {
        digits[index + 1] = digits[index] + 1;
        index++;
    }
    // 修改:将counter设为n-1,避免越界风险
    *pCount = n - 1;
    ft_print_digits(n, digits);
}

void ft_print_combn(int n)
{
    int digits[10]; // n<10,10个元素足够存储所需数字
    int counter;
    int max_digit;

    counter = 0;
    while (counter < n)
    {
        digits[counter] = counter;
        counter++;
    }
    ft_print_digits(n, digits);
    counter = n - 1;
    while (counter >= 0)
    {
        max_digit = 10 - n + counter;
        if (digits[counter] < max_digit)
        {
            digits[counter]++;
            ft_inc(n, digits, &counter);
        }
        counter--;
    }
}

int main()
{
    ft_print_combn(3);
    return 0;
}

修复说明

  1. 新增is_last_combination函数:通过检查每个数字是否符合最后一个组合的规律,准确判断是否需要输出逗号。
  2. 修改ft_inc的*pCount赋值:将*pCount设为n-1,确保回到循环后不会出现数组越界风险。
  3. 调整digits数组大小:从12改为10,匹配n<10的输入限制,避免不必要的内存占用。

编译命令保持不变:

gcc -Wall -Werror -Wextra ft_print_combn.c

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:45:34