扩展argv以保存更多值

这主要是出于好奇。

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

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

http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1425.pdf第5.1.2.2.1节启动

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

有没有特定的理由不扩展不会影响其他字符的argv,或者这是按惯例吗?

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

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的字符串而不用担心它们会被其他人修改,但是它没有明确地让程序员更改包含字符串的数组。