关于* argv []的指针

时间:2012-04-29 01:10:42

标签: c pointers gdb arguments main

这是我的main.c

......
int main(int argc, char **argv)
{
    init_arg(&argc, &argv);
    ......
}

这是我的init_arg.c

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

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

我跑了:

./a.out include

细分错误

当我调试它时,我找到了步骤printf("%s\n", *argv[1]);

出错,显示:

print *argv[1]

Cannot access memory at address 0x300402bfd

我想知道,如何在argv[1]函数中打印init_arg()

3 个答案:

答案 0 :(得分:19)

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

printf("%s\n", (*argv)[1]);

答案 1 :(得分:13)

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

init_arg(&argc, argv);

init_arg应如下所示:

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

答案 2 :(得分:2)

我假设首先传递&argc&argv的原因是您可以在init_arg内更新它们。以下是我更喜欢编写此类函数的方法:

/*
 * init_arg: do something useful with argc and argv, and update argc and argv
 * before returning so that the caller can do something else useful that's
 * not shared with all the other callers of init_arg().
 * (this comment of course needs updating to describe the useful things)
 */
void init_arg(int *argc0, char ***argv0) {
    int argc = *argc0;
    char **argv = *argv0;
    ... all the operative code goes here, and then ...
    *argc0 = argc;
    *argv0 = argv;
}

当然,这意味着您不能在return内进行早期init_arg,因此需要进行一些权衡,但使用相同的常规argc工作肯定要容易得多。和argv内的init_arg