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

C语言命令行参数处理代码出现Segmentation Fault错误如何解决

段错误触发原因分析
  • 未做参数数量校验直接访问固定索引的argv元素:代码开头直接访问argv[2]、argv[3],如果运行程序时传入的参数少于3个,这两个指针指向的是非法内存地址,访问直接触发段错误。
  • 循环访问argv数组越界:argc表示命令行参数总个数,argv的合法索引范围是0 ~ argc-1,循环中i遍历范围是0 ~ argc-1,使用argv[i+1]时,当i等于argc-1,i+1等于argc,对应argv[argc]为NULL空指针,atoi接收空指针会尝试访问非法内存,必然触发段错误。
  • 额外逻辑偏差:需求是打印值小于等于100的参数,代码中判断条件写反为>=100才打印数值,和预期功能不符。
修复后代码示例
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
    printf("# args: %d\n", argc);
    // 新增参数数量校验,避免非法访问
    if (argc < 4) {
        printf("参数不足,需要至少传入3个数值参数\n");
        return EXIT_FAILURE;
    }
    printf("l1 %s\n", argv[2]);
    printf("l2 %d\n", atoi(argv[3]));
    // 调整遍历逻辑,从第一个用户传入参数开始,避免越界
    for (int i = 1; i < argc; i++)
    {
        int num = atoi(argv[i]);
        if (num <= 100)
        {
            printf("%d\n", num);
        }
        else
        {
            printf("vai dar não!\n");
        }
    }
    return EXIT_SUCCESS;
}

内容的提问来源于stack exchange,提问作者Marcel de Araújo Santos Souza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:06:07