这是我的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()
。
答案 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
。