在其他.c文件中使用main.c的argv出现段错误?求助排查
问题分析与修复
为什么会触发段错误?
你犯了一个典型的C语言指针类型不匹配错误:
- 在
main.c里,argv[2]和argv[3]是单个字符串的指针(char*)。 - 但你给
method1声明的参数是指针数组(char*[],等价于char**)——也就是指向指针的指针。
当你把char*传给char**参数时,程序会把这个字符串的首地址当成指针数组的地址来用。执行a[0]的时候,相当于去解引用这个字符串首地址(把它当作指针),这属于非法内存访问,直接触发段错误。
两种修复方案
方案一:method1只需要单个字符串(大概率是你要的)
如果method1本来就是处理单个字符串,那就把函数参数改成char*:
- 更新
header.h的声明:
void method1(char *a, char *b, int c);
- 修改
filewithmethods.c的函数实现:
void method1(char *a, char *b, int c) { printf("a contains: %s\n", a); // 直接用a就行,不用a[0] }
这样调用时传argv[2]就完全匹配,不会再有问题。
方案二:method1需要接收字符串数组
如果你确实要传数组(比如想把argv[2]、argv[3]作为数组的前两个元素),那要传数组的地址:
保持header.h和filewithmethods.c不变,修改main.c的调用代码:
// 传递从argv[2]开始的子数组的地址 method1(&argv[2], &argv[3], number);
此时&argv[2]是char**类型,和method1的参数匹配,a[0]就对应argv[2],a[1]对应argv[3],以此类推。
额外提醒
- 编译时加
-Wall参数(比如gcc -Wall main.c filewithmethods.c -o program),编译器会帮你发现这类类型不匹配的警告,提前避坑。 - 用
argv之前先检查argc的大小,比如你用到argv[4],得确保用户输入了足够多的参数(argc >=5),不然也会出现越界访问问题。
内容的提问来源于stack exchange,提问作者syhzurp
相关产品推荐
相关产品推荐

