求助:这段C代码为何出现segmentation fault(段错误)?
C程序段错误问题分析与修复
问题根源
段错误的直接原因是未检查命令行参数是否传入就使用argv[1]:
- 当运行程序时未提供文件名参数,
argv[1]的值为NULL(对应valgrind提示的Address 0x0),strcpy尝试从NULL地址读取数据,直接触发段错误。 - OnlineGDB中出现文件未打开的提示,是因为你当时传入了参数,但指定的文件不存在,属于
fopen调用失败的场景,和本地的段错误是两种不同运行情况。调整fileName数组大小无济于事,因为问题根本不在数组容量,而是源指针为空。
修复步骤
- 先检查命令行参数数量:在使用
argv[1]前,判断argc是否大于1(argc表示命令行参数总数,程序自身文件名算第一个参数,传入文件名后argc至少为2):
int main(int argc, char *argv[]) { char fileName[50] = {}; char fileLine[200] = {}; char *token = NULL; char *delimiters = " \n\t"; FILE *FH = NULL; // 检查是否传入文件名参数 if (argc < 2) { printf("请传入文件名作为命令行参数\nExiting..."); exit(1); } //step 1e to 1g strcpy(fileName, argv[1]); FH = fopen(fileName, "r+"); if (FH == NULL) { printf("File did not open\nExiting..."); exit(0); } // 后续代码... }
- 避免缓冲区溢出风险:
strcpy不检查目标数组容量,如果传入的文件名过长会破坏栈数据,建议改用strncpy并手动添加终止符:
strncpy(fileName, argv[1], sizeof(fileName)-1); fileName[sizeof(fileName)-1] = '\0'; // 确保字符串以'\0'结尾
内容的提问来源于stack exchange,提问作者fourarms
相关产品推荐
相关产品推荐

