在任何C程序中,命令行参数
如果有这样的情况,以下是一个代码片段的示例参考:
argv [0]
指向用于调用程序的名称。是否存在某种情况,它将指向空字符串“”
?如果有这样的情况,以下是一个代码片段的示例参考:
argv [0]
指向用于调用程序的名称。是否存在某种情况,它将指向空字符串“”
?argc
的值大于零,则数组成员 argv[0]
至 argv[argc - 1]
(包括这两个元素)必须包含指向字符串的指针,这些指针在程序启动前由主机环境赋予实现定义的值。其目的是从托管环境中的其他位置提供信息以供程序在程序启动之前确定。
- 如果argc
的值大于零,则由argv [0]
指向的字符串表示程序名称;如果程序名称在主机环境中不可用,则argv[0][0]
应为空字符。argc
大于零,则argv[0]
绝不会是空字符串,但这种情况可能会发生。(请注意,当 argc
等于 n
时,argv[0]
到 argv[n - 1]
永远不为 null,总是指向一个字符串。该字符串本身可能为空。如果 n
为零,则 argv[0]
为 null。)argv[0]
可能为空指针,或者可能指向空字符串(""
)。N1256 5.1.2.2.1p2:argc的值必须为非负数。
argv[argc]必须是空指针。
[...]
如果argc的值大于零,则程序名称由argv[0]所指向的字符串表示;如果主机环境中没有可用程序名称,则argv[0][0]应为null字符。如果argc的值大于1,则argv[1]到argv[argc-1]所指向的字符串表示程序参数。
在类Unix系统上,程序是通过exec()
函数族(execl()
、execlp()
等)之一来调用的,调用者可以指定传递给main()
函数的确切参数。(甚至可以以违反C标准规定的方式调用程序。)argv[0]
(假设它既不是null也不是空)"表示程序名称"。标准故意模糊关于如何表示程序名称的细节。特别是,它不需要提供可用于调用程序的名称(因为标准甚至不要求可以通过名称调用程序)。argv
指向一个字符串(最后一个必须为null)。一个糟糕的实现可能会将它们全部提供为空字符串,但不是全部为null。 - GManNickGargc == 0
,那么 argv[0]
是一个空指针。(当您写下您的评论时,我没有引用那部分。) - Keith Thompsonexec()
函数族!谢谢!! - Sangeeth Saravanarajexec
的调用者按照标准来调用它,忽略程序漏洞呢,@KeithThompson? - user129393192argv[0]
可以是NULL
或者是空字符串(""
)。你应该在编写程序时假设这种情况可能发生,否则你会创建一个(小)安全风险。很容易调用你的程序并将argv
设置为攻击者想要的任何内容。作为证明,请考虑以下两个程序。第一个程序echoargv.c
打印出argv
的内容:#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int i;
for (i = 0; i < argc; ++i)
printf("argv[%d] = \"%s\"\n", i, argv[i]);
exit(0);
}
argv0
可以调用其他程序,并允许用户指定该程序的命令行参数。#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
(void) execv(argv[1], argv+2);
perror("execv");
exit(1);
}
这是一个针对Posix的版本,非标准环境可能需要更改。
以下是如何使用它们:
$ gcc -o echoargv echoargv.c
$ gcc -o argv0 argv0.c
$ ./argv0 ./echoargv
$ ./argv0 ./echoargv ''
argv[0] = ""
$ ./argv0 ./echoargv 'this is fun' 'it is fun indeed'
argv[0] = "this is fun"
argv[1] = "it is fun indeed"
$
argv0
的第一次运行将echoargv
的argv[0]
设置为NULL。
第二次运行将其设置为空字符串。
第三次运行只是为了好玩:请注意,argv [0 ]
不需要与程序的实际名称有任何关系。
这可能会对您造成什么影响?例如,如果您在使用消息中盲目打印程序的名称:
printf("usage: %s [options] [FILE]...\n", argv[0]);
更好的方式:
const char *program_name = "some default name"; /* (global) variable */
if (argv[0] && argv[0][0])
program_name = argv[0];
printf("usage: %s [options] [FILE]...\n", program_name);
在C语言中,argv [ 0 ]可以为空,例如如果您直接调用主函数(在C中可以使用一些技巧来实现)。 我不知道C ++是否允许直接调用主函数。
argv[0]
是否指向一个空字符串(""
, {'\0'}
),而不是指向NULL
? - alkargv[0]=NULL
。 - Sangeeth Saravanarajmain()
函数;而 C 语言可以。 - Jonathan Lefflermain
函数,可以传递任意垃圾值。类似于argc == 2, argv[1] == NULL
这样的情况很可能破坏正常的参数处理。但这只是你代码中的一个错误。在最初调用main
函数时,你可以安全地做出关于argc
和argv
的假设。 - Keith Thompson