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; }
修复说明
- 新增
is_last_combination函数:通过检查每个数字是否符合最后一个组合的规律,准确判断是否需要输出逗号。 - 修改
ft_inc的*pCount赋值:将*pCount设为n-1,确保回到循环后不会出现数组越界风险。 - 调整
digits数组大小:从12改为10,匹配n<10的输入限制,避免不必要的内存占用。
编译命令保持不变:
gcc -Wall -Werror -Wextra ft_print_combn.c
内容的提问来源于stack exchange,提问作者Huseyin Donmez
相关产品推荐
相关产品推荐

