如果没有从命令行传递参数,即。如果
argc
是 1,
我们仍然可以为 argv[1],argv[2],.....
分配内存并使用这些缓冲区进行进一步的实验。
如果这是未定义的行为,我仍然可以以某种方式使用它吗?
不,C 标准没有指定
argv
具有超出 argv[argc]
之外的任何元素,因此它们可能不存在于 C 的对象内存模型中,并且 C 标准未定义使用它们的行为。
C 2018 5.1.2.2.1 2 说:
…
应为空指针。argv[argc]
如果
的值大于零,则数组成员argc
到argv[0]
应包含指向字符串的指针,这些字符串在程序启动之前由主机环境给出实现定义的值。argv[argc-1]
…
这就是定义
argv
数组范围的全部内容;标准中没有任何内容表明还有更多元素。
当
argc
为1时,定义了使用argv[1]
,但未定义使用argv[2]
。
您可以将新值存储到定义的元素中,因为 C 2018 5.1.2.2.1 2 还说:
参数
和argc
以及argv
数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。argv
我可以在
之后访问argv[]
元素吗?argv[argc]
您可以...但是仅在此代码中
#include <stdio.h>
int main(int argc, char **argv) {
if (argc == 1) {
char *foo[] = {"bar", "baz", "quux", NULL, "bingo"};
main(3, foo);
} else {
printf("argc is %d; argv[4] is \"%s\"\n", argc, argv[4]);
}
return 0;
}
参见 在 ideone 上运行的代码。
在所有其他代码中,您不能。
始终
argv[argc]
等于 NULL
。在所描述的情况下,argc
等于1
,数组argv
包含两个指针argv[0]
和argv[1]
,其中argv[1]
是空指针。
您可以重新分配指针,但这没有多大意义,因为这会使您的程序不清楚。相反,如果需要,您可以声明自己的数组。
是的,你可以,但这没有多大意义,甚至可能导致程序崩溃
因为
argv
是指向指针数组argv[]
的指针,并且也位于堆栈上。
取消引用并写入这些位置可能会损坏堆栈并导致程序因分段错误而崩溃。