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
相关产品推荐
相关产品推荐

