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

C语言传参调用printString处理终端输入时触发Segmentation fault

问题成因

触发段错误和堆空间分配没有关系,核心是3处代码错误:

  • 传参类型完全不匹配:argv作为main函数的形参,本身就是char**类型(指向命令行参数指针数组首元素的指针),调用printString时写&argv取的是argv这个局部变量自身的栈地址,类型为char***,和函数形参期望的char**类型完全不符。函数内按char**的偏移规则访问这个错误地址时,会读到非法内存值,把垃圾值当字符串地址访问,直接触发段错误。
  • 死循环bug:while循环内从未修改循环变量commandAmount的值,只要传入的命令行参数数量大于1,程序就会永远卡在循环中,就算传参类型正确也会无限运行跑飞。
  • 函数声明不规范:开头对printString的前置声明写为void printString();,这是C语言老式的不确定参数声明,不会让编译器对后续的传参做类型校验,会掩盖传参类型不匹配的问题,埋下隐患。
修复方案

针对上述问题逐点修改即可:

  1. 调用printString时直接传入argv,不要额外加取地址符&
  2. 每次循环结束后将commandAmount自增,正常遍历所有传入的命令行参数
  3. 补全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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:12:35