C++ 扩展argv以容纳更多值

C++ 扩展argv以容纳更多值,c++,c,C++,C,这主要是出于好奇 ISO C规范中规定了以下内容: 参数argc和argv以及argv数组指向的字符串应 可由程序修改,并在程序之间保留其最后存储的值 启动和程序终止 第5.1.2.2.1节程序启动 尽管如此,我还是在网上看到了一些建议,建议您不应该重新分配argv来扩展它,而应该复制它 是否有特定的原因不扩展不影响其他字符**的argv,或者这是按照惯例 我不知道是否真的需要用附加值扩展argv,但问题是argv是否与程序的POV不同。argc和argv作为参数没有什么特殊之处 1) argc

这主要是出于好奇

ISO C规范中规定了以下内容:

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

第5.1.2.2.1节程序启动

尽管如此,我还是在网上看到了一些建议,建议您不应该重新分配argv来扩展它,而应该复制它

是否有特定的原因不扩展不影响其他字符**的argv,或者这是按照惯例


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

argc和argv作为参数没有什么特殊之处

1) argc只是一个int,通过copy传递到main函数中。改变它 对任何事情都绝对没有影响

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

请注意,该标准不允许释放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 ???
不过,如果你这么做,不会发生什么坏事——只是没有定义而已。使用GCC4.4在centos 6.5上进行的测试(不要取笑我使用了这么旧的版本,好吗?)没有给我答案 问题。因此,没有人试图在程序退出时释放argv()的内容。还有几个库,作为处理argv的一个副作用,可以重新排序 它的内容。我想不起来我在哪里看到的

然而,你不能做的,因为你没有办法去做,就是改变 argv指向的数组。例如,在我的系统上,尝试realloc()argv会抛出无效的指针错误。换句话说,argv指向的数组似乎不在堆上

无法将realloc()数组传递到函数中并不是什么新的或特殊的事情,例如数组可能是静态的,或者是在堆栈上分配的,而标准没有说明如何分配argv数组


在任何情况下,标准允许程序员以任何方式使用传递到main中的字符串,而不必担心它们会被其他人修改,但它并不明确允许程序员更改保存字符串的数组。

argc和argv作为参数没有什么特别之处

1) argc只是一个int,通过copy传递到main函数中。改变它 对任何事情都绝对没有影响

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

请注意,该标准不允许释放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 ???
不过,如果你这么做,不会发生什么坏事——只是没有定义而已。使用GCC4.4在centos 6.5上进行的测试(不要取笑我使用了这么旧的版本,好吗?)没有给我答案 问题。因此,没有人试图在程序退出时释放argv()的内容。还有几个库,作为处理argv的一个副作用,可以重新排序 它的内容。我想不起来我在哪里看到的

然而,你不能做的,因为你没有办法去做,就是改变 argv指向的数组。例如,在我的系统上,尝试realloc()argv会抛出无效的指针错误。换句话说,argv指向的数组似乎不在堆上

无法将realloc()数组传递到函数中并不是什么新的或特殊的事情,例如数组可能是静态的,或者是在堆栈上分配的,而标准没有说明如何分配argv数组


在任何情况下,标准允许程序员以任何方式使用传递到main中的字符串,而不必担心它们会被其他人修改,但它并不明确允许程序员更改保存字符串的数组。

首先,您不知道
argv
是如何分配的,如果它完全被分配了……如果它是以正常方式
malloced
,则调用
main()
的库可能会尝试然后
释放它,从而导致双重释放。你可以搞乱内容,但你不拥有对象。你说的“重新分配”是什么意思?您当然不能使用
realloc
,因为它(几乎可以肯定)不是来自
malloc
(即使它来自
malloc
,运行时也可能希望在程序退出时
释放它)。您需要分配一些新内存并将
argv
指针复制到该内存中。虽然argv可以修改,而且语言当然允许修改,但从设计/维护的角度来看,如果将其视为常量,则要容易得多。它只是一个字符数组,并不特殊。我想说扩展向量的工作原理是一样的:首先,你不知道
argv
是如何分配的,如果它是被分配的……如果它是
malloced
以正常的方式,调用
main()
的库可能会尝试然后
释放它,导致双重自由。你可以搞乱内容,但你不拥有对象。你说的“重新分配”是什么意思?您当然不能使用
realloc
,因为它(几乎可以肯定)不是来自
malloc
(即使它来自
malloc
,运行时也可能希望在程序退出时
释放它)。您需要分配一些新内存,并将
argv
指针复制到该内存中