关于*argv []的指针

thl*_*ood 14 c gdb pointers program-entry-point arguments

这是我的 main.c

......
int main(int argc, char **argv)
{
    init_arg(&argc, &argv);
    ......
}
Run Code Online (Sandbox Code Playgroud)

这是我的 init_arg.c

......
void init_arg(int *argc, char ***argv)
{
    printf("%s\n", *argv[1]);
    ......
}
Run Code Online (Sandbox Code Playgroud)

我编译它没有错误和警告.

我跑了:

./a.out include

它会出现Segmentation故障

当我调试它时,我发现了一步 printf("%s\n", *argv[1]);

弄错了,它显示:

print *argv[1]

Cannot access memory at address 0x300402bfd

我想知道,如何打印argv[1]init_arg()功能.

das*_*ght 19

您需要在(*argv)周围添加一对括号来更改评估顺序.你当前的方式,首先评估[1],产生一个无效的指针,然后取消引用,导致未定义的行为.

printf("%s\n", (*argv)[1]);
Run Code Online (Sandbox Code Playgroud)

  • @torek我会避免使用`argv [0]`代替`(*argv)`,因为传入的是一个"标量"指针(即一个指向单个数组的指针),而不是一个指针数组阵列.我认为`(*argv)`语法强调了我们正在查看指向标量的指针的概念. (7认同)
  • 我的观点是*C语言*没有提供任何方式(在被调用者中,例如函数`fn`)来发现一些指针参数`T*p`是否指向单个项(`T var; fn(&var) );;)或第一个`N`连续项(`T var [N]; fn(var);`).它有助于*程序员*区分它们,但语言本身并不适合你.与例如Pascal和Go相比较. (2认同)

alf*_*alf 13

Argv已经是一个指针.就像这样传递它:

init_arg(&argc, argv);
Run Code Online (Sandbox Code Playgroud)

而init_arg应如下所示:

void init_arg(int *argc, char **argv) {
    printf("%s\n", argv[1]);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是正确的,但他也可以通过`argc`而不是`&argc`.据推测,传递`&argc`和`&argv`的要点是允许`init_arg`修改它们. (5认同)