扩展argv以保存更多值

时间:2014-08-04 18:28:58

标签: c++ c

这主要是出于好奇。

在ISO C规范中,如下所述:

  

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

http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1425.pdf部分5.1.2.2.1程序启动

尽管如此,我在网上看到你不应该重新分配argv来扩展它,而是复制它。

是否有一个特定的理由不扩展不会影响其他char **的argv,或者这是按惯例吗?

我不知道是否真的需要用附加值扩展argv,但问题是argv是否与程序的POV有关。

1 个答案:

答案 0 :(得分:5)

argc和argv作为参数没什么特别的。

1)argc只是一个通过复制传递给main函数的int。改变它了 绝对没有任何影响。

2)argv,只是一个指向c-strings的指针数组。该标准允许您修改argv指向的字符串。

请注意,该标准不允许您释放argv指向的字符串,也不会 假设您可以修改argv指向的数组。

例如,如果argc == 2且argv [1]指向一个字符串" hello world",那就没问题了:

argv[1][0]='c'; // the string is now "cello world" which is the name of a store
                // located right next to banjo emporium.

但未定义:

argv[1] = "yo mamma"; // what are you thinking, are you 12 ???

虽然如果你那样做没有什么不好的事情 - 它只是没有定义。使用gcc 4.4对centos 6.5进行测试(不要因为使用这样的旧版本取笑我,好吗?)给了我一个号码 的问题。所以没有人试图在程序退出时释放()argv的内容。还有几个库作为处理argv的副作用,重新排序 它的内容。我想不出我看到的地方。

但是,你无法做到的,因为你无法做到,就是要改变它的大小 argv指向的数组。例如,在我的系统上,尝试realloc()argv会引发无效的指针错误。换句话说,argv指向的数组似乎不在堆上。

无法传递给函数的realloc()数组不是新的或特殊的,例如数组可能是静态的,或者在堆栈上分配,标准没有说明如何分配argv数组。

在任何情况下,该标准允许程序员以任何方式使用传递给main的字符串而不用担心它们会被其他人修改,但是它没有明确地让程序员更改包含字符串的数组。 / p>