这主要是出于好奇.
在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的特殊功能.
argc和argv作为参数没有什么特别之处.
1)argc只是一个通过副本传递给main函数的int.改变它绝对没有任何影响.
2)argv,只是一个指向c字符串的指针数组.该标准允许您修改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.
Run Code Online (Sandbox Code Playgroud)
但它未定义:
argv[1] = "yo mamma"; // what are you thinking, are you 12 ???
Run Code Online (Sandbox Code Playgroud)
虽然,如果你这样做,没有什么不好的事情 - 它只是没有定义.使用gcc 4.4对centos 6.5进行测试(不要因为使用这样的旧版本取笑我,好吗?)没有给我任何问题.所以没有人试图在程序退出时释放()argv的内容.还有几个库作为处理argv的副作用,重新排序其内容.我想不出我看到的地方.
但是,你无法做到的,是因为你无法做到这一点,就是改变argv所指向的数组的大小.例如,在我的系统上,尝试realloc()argv会引发无效的指针错误.换句话说,argv指向的数组似乎不在堆上.
无法传递给函数的realloc()数组不是新的或特殊的,例如数组可能是静态的,或者在堆栈上分配,标准没有说明如何分配argv数组.
在任何情况下,该标准允许程序员以任何方式使用传递给main的字符串而不用担心它们会被其他人修改,但它没有明确地让程序员更改包含字符串的数组.
| 归档时间: |
|
| 查看次数: |
523 次 |
| 最近记录: |