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

如何将字符串作为函数参数传递?解决仿命令行参数函数段错误问题

问题分析与解决方案

你遇到的段错误完全是因为对char** argv的类型理解有误,咱们一步步拆解问题:

为什么原代码会触发段错误?

你的hello函数期望的argv是一个指向字符串数组的指针(也就是char**),就像main函数里的argv一样——每个元素都是一个独立的命令行参数字符串。但你调用时传的是"i am fine",这只是一个普通的char*(单个字符串)。

当函数里执行printf("%s\n", argv[i])时,它会把"i am fine"的前几个字节当作内存地址来访问:比如在64位系统下,argv[0]会取字符串的前8个字节('i' ' ' 'a' 'm' ' ' 'f' 'i' 'n')转换成一个指针,这个地址明显是非法的,操作系统自然会抛出段错误。

修正方案

根据你的需求,分两种情况处理:

情况1:把"i am fine"拆成3个独立参数

如果你希望hello输出3个参数(i、am、fine),需要先创建一个字符串数组,每个元素对应一个参数,再传给函数:

#include <stdio.h>

int hello(int argc, char **argv) { 
    int i=0; 
    printf("%d\n", argc); 
    for(i=0; i<argc; i++) 
        printf("%s\n", argv[i]); 
    return 0; 
}

int main () { 
    // 创建字符串数组,每个元素是一个参数
    char* args[] = {"i", "am", "fine"};
    hello(3, args); 
    return 0; 
}

运行后会输出:

3
i
am
fine

情况2:把"i am fine"作为单个参数

如果你只是想输出整个字符串(也就是把它当作1个参数),只需要把单个字符串的地址传给argv,同时把argc设为1:

#include <stdio.h>

int hello(int argc, char **argv) { 
    int i=0; 
    printf("%d\n", argc); 
    for(i=0; i<argc; i++) 
        printf("%s\n", argv[i]); 
    return 0; 
}

int main () { 
    char* single_arg = "i am fine";
    // 传递单个字符串的地址(&single_arg是char**类型)
    hello(1, &single_arg); 
    return 0; 
}

运行后会输出:

1
i am fine

关键总结

char** argv本质是指针的指针,它指向的是一个存储着多个字符串指针的数组,而不是单个字符串。一定要保证传入的参数类型和函数期望的匹配,否则就会出现内存访问错误。

内容的提问来源于stack exchange,提问作者Sheik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:27:45