全局使用- BaseFile: myfile.dat
- Environment:
WaterDepth: 0.0
WaveDirection: 0.0
WaveGamma: 0.0
WaveAlpha: 0.0
指针是否安全?或者是否存在可能无效的情况?
即:这段代码安全吗?
argv
答案 0 :(得分:39)
是的,全球使用argv
是安全的;您可以像在程序中使用任何char**
一样使用它。 C99标准甚至指定了这个:
参数
argc
和argv
以及argv
数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。
C ++标准没有类似的段落,但相同的是隐含的,没有相反的规则。
请注意,C ++和C是不同的语言,您应该选择一个来询问您的问题。
答案 1 :(得分:17)
只要main()
函数不退出,它应该是安全的。 main()
退出后可能发生的一些事例:
main()
不得在那些存储argv
中使用。
The reference没有说出任何可以假设main()
函数的参数的生命周期与函数参数生命周期的一般规则不同的理由。
只要argv
指针本身有效,C / C ++运行时必须保证此指针指向的内容有效(当然,除非某些内容破坏了内存)。因此,使用指针和长的内容必须是安全的。在main()
返回后,C / C ++运行时没有理由保持内容有效。因此,上述推理适用于指针及其指向的内容。
答案 2 :(得分:8)
全局使用argv指针是安全的
这需要更多澄清。正如C11
规范在章节§5.1.2.2.1中所述,程序启动
[..] ..有两个参数(这里称为
argc
和argv
,但可以使用任何名称,因为它们是声明它们的函数的本地名称)< / p>
这意味着,变量本身的范围仅限于main()
。它们本身不是全球。
标准再次说,
参数
argc
和argv
以及argv数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。
这意味着,这些变量的生命周期直到main()
完成执行。
因此,如果您使用全局变量来保存main()
中的值,则可以安全地使用这些全局变量来访问任何其他函数中的相同值。
答案 3 :(得分:5)
This thread从C标准的角度详细讨论了这个问题,包括一个显示argv数组内容的引文(而不是argv指针本身,如果你拿了一个地址&argv
并存储了那个),直到&#34;程序终止&#34;,并断言它是&#34;显而易见的&#34;当atexit注册函数正在执行时,程序终止尚未以与此相关的方式发生:
该程序在atexit注册期间未终止 功能处理。我们认为这很明显。
(我不确定Douglas A. Gwyn是谁,但听起来像#34;我们&#34;意味着C标准委员会?)
讨论的背景主要是关于存储指针argv[0]
(程序名称)的副本。
相关的C标准文本是5.1.2.2.1:
参数argc和argv以及指向的字符串 argv数组应该由程序修改,并保留它们 程序启动和程序之间的最后存储值 终止。
当然,C ++不是C,它的标准在这个问题上可能略有不同,或者没有解决它。
答案 4 :(得分:3)
您可以将它们作为参数传递,也可以将它们存储在global variables
中。只要您不从main
返回并尝试在atexit
处理程序或全局范围内的变量的析构函数中处理它们,它们仍然存在并且可以从任何范围进行访问。
答案 5 :(得分:2)
是的,它对于ether C或C ++是安全的,因为在main完成后没有线程。