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

时间:2015-07-24 07:58:17

标签: c argv

全局使用- BaseFile: myfile.dat - Environment: WaterDepth: 0.0 WaveDirection: 0.0 WaveGamma: 0.0 WaveAlpha: 0.0 指针是否安全?或者是否存在可能无效的情况?

即:这段代码安全吗?

argv

6 个答案:

答案 0 :(得分:39)

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

  

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

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

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

答案 1 :(得分:17)

只要main()函数不退出,它应该是安全的。 main()退出后可能发生的一些事例:

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

    不得在那些存储argv中使用。

    The reference没有说出任何可以假设main()函数的参数的生命周期与函数参数生命周期的一般规则不同的理由。

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

答案 2 :(得分:8)

  

全局使用argv指针是安全的

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

  

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

这意味着,变量本身的范围仅限于main()。它们本身不是全球

标准再次说,

  

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

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

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

答案 3 :(得分:5)

comp.lang.c.moderated新闻组中的

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完成后没有线程。