C语言传参调用printString处理终端输入时触发Segmentation fault
问题成因
触发段错误和堆空间分配没有关系,核心是3处代码错误:
- 传参类型完全不匹配:
argv作为main函数的形参,本身就是char**类型(指向命令行参数指针数组首元素的指针),调用printString时写&argv取的是argv这个局部变量自身的栈地址,类型为char***,和函数形参期望的char**类型完全不符。函数内按char**的偏移规则访问这个错误地址时,会读到非法内存值,把垃圾值当字符串地址访问,直接触发段错误。 - 死循环bug:
while循环内从未修改循环变量commandAmount的值,只要传入的命令行参数数量大于1,程序就会永远卡在循环中,就算传参类型正确也会无限运行跑飞。 - 函数声明不规范:开头对
printString的前置声明写为void printString();,这是C语言老式的不确定参数声明,不会让编译器对后续的传参做类型校验,会掩盖传参类型不匹配的问题,埋下隐患。
修复方案
针对上述问题逐点修改即可:
- 调用
printString时直接传入argv,不要额外加取地址符& - 每次循环结束后将
commandAmount自增,正常遍历所有传入的命令行参数 - 补全
printString前置声明的完整参数列表,让编译器正常做类型检查
修复后完整代码
#include <stdio.h> // 正确声明函数的完整参数列表 void printString(int commandAmount, char* argv[]); int main (int argc, char* argv[]) { int commandAmount = 1; while (commandAmount < argc) { // 直接传入argv,不做取地址操作 printString(commandAmount, argv); // 循环变量自增,避免死循环 commandAmount++; } return 0; } void printString(int commandAmount, char* argv[]) { printf("the word is %s,", argv[commandAmount]); }
运行效果
编译后执行命令:
./shortExample example
正常输出:
the word is example,
无段错误报错。
内容的提问来源于stack exchange,提问作者c_starter
相关产品推荐
相关产品推荐

