c++ - 从以下 func(int *argc, char ***argv) 打印参数
问题描述
我有一个这样声明的函数:
void func( int *argc, char ***argv )
{
printf("argc= %d\n",*argc);
printf("argv 0 = %s\n",*argv[0]); // correct printout
printf("argv 1 = %s\n",*argv[1]); // segmentation fault
}
从主程序调用它:
func(&argc, &argv);
当我按照我的意愿使用一个参数执行它时,我得到了分段错误。为什么?如果没有参数并且注释了“分段错误”行,则没有错误并且打印出可执行文件的名称。
解决方案
这是运算符优先级的问题:subcript ( a[]
) 的优先级高于取消引用 ( *a
)。
*argv[1]
确实如此*(argv[1])
。但是,您argv
不指向数组(仅指向原始char**
指针的位置),因此argv[1]
不包含有效地址并且取消引用它会产生段错误。
这应该可以解决问题:
void func( int *argc, char ***argv )
{
int i;
printf("argc= %d\n",*argc);
printf("argv 0 = %s\n",(*argv)[0]); // correct printout
for(i=1; i<*argc; i++) {
printf("argv %d = %s\n", i, (*argv)[i]);
}
}
(尽管出于所有实际目的,我总是假设main(int, char**)
应该考虑传递给程序(如中)的参数const
,在这种情况下,额外的间接性将不会带来什么好处)
推荐阅读
- azure-devops - 使用 System.AccessToken 创建服务端点
- php - 在 Laravel 5.7 中限制登录尝试
- sql - R:在 SQL 脚本中使用的日期转换
- ios - UITextView ContentInset
- powerbi - 在 PowerBI 的分组列中获取最大值
- json - Elastic Sink 中的 Kafka Connect 序列化错误
- java - 从字符串中提取多个子字符串(例如“B#####”,其中# 是所有可能的数字)-Java-Android
- reactjs - 无法正确移除 D3 元素
- java - JMeter 仪表板生成 Java 堆空间
- api - 在变量 Ionic 中存储 Api 响应