如何将字符串作为函数参数传递?解决仿命令行参数函数段错误问题
问题分析与解决方案
你遇到的段错误完全是因为对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
相关产品推荐
相关产品推荐

