首页 > 解决方案 > 从以下 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);

当我按照我的意愿使用一个参数执行它时,我得到了分段错误。为什么?如果没有参数并且注释了“分段错误”行,则没有错误并且打印出可执行文件的名称。

标签: c++

解决方案


这是运算符优先级的问题: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,在这种情况下,额外的间接性将不会带来什么好处)


推荐阅读