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标准甚至指定了这个:
数组指向的参数
argc和argv字符串argv应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.
C++标准没有类似的段落,但相同的是隐含的,没有相反的规则.
请注意,C++和C是不同的语言,您应该选择一个来询问您的问题.
Ser*_*tch 17
只要main()功能不退出,它应该是安全的.main()退出后可能发生的一些事例包括:
main()存储argv不得用于那些.
该引用没有说任何可以假设main()函数参数的生命周期与函数参数生命周期的一般规则不同的理由.
只要argv指针本身有效,C/C++运行时必须保证此指针指向的内容有效(当然,除非某些内容破坏了内存).因此,使用指针和长的内容必须是安全的.之后main()的回报,没有理由对C/C++运行时保持内容有效无论是.因此,上述推理适用于指针及其指向的内容.
全局使用argv指针是否安全?
这需要更多的澄清.正如C11规范章节§5.1.2.2.1中所述,程序启动
[..] ..有两个参数(这里称为
argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称)
这意味着,变量本身的范围有限main().他们不是全球性的.
标准再次说,
argv数组指向的参数
argc和argv字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.
这意味着,这些变量的生命周期直到main()完成执行.
因此,如果您使用全局变量来保存值main(),则可以安全地使用这些全局变量来访问任何其他函数中的全局变量.
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,它的标准可能在这个问题上略有不同或者没有解决它.