全局使用argv指针是否安全?

Ste*_*ell 29 c argv

argv全局使用指针是否安全?或者是否存在可能无效的情况?

即:这个代码安全吗?

char **largs;
void function_1()
{
    printf("Argument 1: %s\r\n",largs[1]);
}
int main(int argc,char **argv)
{
    largs = argv;
    function_1();
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 39

是的,argv全球使用是安全的; 您可以像char**在程序中使用任何一样使用它.C99标准甚至指定了这个:

数组指向的参数argcargv字符串argv应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.

C++标准没有类似的段落,但相同的是隐含的,没有相反的规则.

请注意,C++和C是不同的语言,您应该选择一个来询问您的问题.

  • 考虑到两种语言都使用`argv`并且当他第一次发布问题时他明确地标记了`c`和`c ++`,OP很可能打算知道C和C++中的行为,而不是其中一种. (4认同)

Ser*_*tch 17

只要main()功能不退出,它应该是安全的.main()退出后可能发生的一些事例包括:

  1. 全局变量和静态变量的析构函数
  2. 线程运行时间超过 main()

存储argv不得用于那些.

该引用没有说任何可以假设main()函数参数的生命周期与函数参数生命周期的一般规则不同的理由.

只要argv指针本身有效,C/C++运行时必须保证此指针指向的内容有效(当然,除非某些内容破坏了内存).因此,使用指针和长的内容必须是安全的.之后main()的回报,没有理由对C/C++运行时保持内容有效无论是.因此,上述推理适用于指针及其指向的内容.

  • 在某种程度上,你的论证似乎主要适用于`argv`指针本身的生命周期(即如果你存储了一个指针_to_来自`&argv`)而不是内容. (3认同)

Sou*_*osh 8

全局使用argv指针是否安全?

这需要更多的澄清.正如C11规范章节§5.1.2.2.1中所述,程序启动

[..] ..有两个参数(这里称为argcargv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称)

这意味着,变量本身的范围有限main().他们不是全球性的.

标准再次说,

argv数组指向的参数argcargv字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.

这意味着,这些变量的生命周期直到main()完成执行.

因此,如果您使用全局变量来保存值main(),则可以安全地使用这些全局变量来访问任何其他函数中的全局变量.

  • 我想知道``largs`在`atexit`函数中是否仍然有效 (2认同)

Ran*_*832 5

comp.lang.c.moderated新闻组中的这个帖子从C标准的角度详细讨论了这个问题,包括一个显示argv数组内容的引文(而不是argv指针本身,如果你拿了一个地址)&argv并存储,直到"程序终止",以及一个断言,即当atexit注册的函数正在执行时,程序终止尚未以与此相关的方式发生"显而易见":

在atexit注册的函数处理期间,程序没有终止.我们认为这很明显.

(我不确定Douglas A. Gwyn是谁,但听起来"我们"是指C标准委员会?)

讨论的上下文主要涉及存储指针的副本argv[0](程序名称).

相关的C标准文本是5.1.2.2.1:

参数argc和argv以及argv数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.

当然,C++不是C,它的标准可能在这个问题上略有不同或者没有解决它.