如果argc为1,我还可以使用argv[1],argv[2],...字符数组吗?

问题描述 投票:0回答:4

如果没有从命令行传递参数,即。如果

argc
1,
我们仍然可以为
argv[1],argv[2],.....
分配内存并使用这些缓冲区进行进一步的实验。 如果这是未定义的行为,我仍然可以以某种方式使用它吗?

c command-line argv argc
4个回答
3
投票

不,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
数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。


1
投票

我可以在

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 上运行的代码

在所有其他代码中,您不能。


0
投票

始终

argv[argc]
等于
NULL
。在所描述的情况下,
argc
等于
1
,数组
argv
包含两个指针
argv[0]
argv[1]
,其中
argv[1]
是空指针。

您可以重新分配指针,但这没有多大意义,因为这会使您的程序不清楚。相反,如果需要,您可以声明自己的数组。


0
投票

是的,你可以,但这没有多大意义,甚至可能导致程序崩溃

因为

argv
是指向指针数组
argv[]
的指针,并且也位于堆栈上。

取消引用并写入这些位置可能会损坏堆栈并导致程序因分段错误而崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.