在阅读Is argv[n] writable?后,我不完全确定从该主题中得出什么结论。
从C89起,C标准规定:
参数argc和argv以及argv数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。
在一个程序中,我一直在测试以下代码:
int main(int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++)
{
/* Do something */
argv[i] = NULL; /* argv[i] is no longer needed */
}
for (i = 1; i < argc; i++)
{
if (argv[i])
/* Do something else */
}
}
虽然这对我来说对Linx Mint 17.2和gcc 4.8.4有效,但设置argv[i] = NULL
似乎是有效和非标准化行为,至少根据标准。这使我不愿意在生产中使用此代码。
(我基本上迭代argv
两次,确保我跳过argv[i] == NULL
。)
支持以这种方式重新分配argv[i]
有哪些证据(如果有的话)?我担心我可能会导致内存和/或编译器问题,因为我不能保证其他系统如何处理这个问题。
有没有更好的方法来做我想做的事情?
修改
我忘了添加输入参数由标志和文件名组成。这些可以是任何顺序,所以我使用argv[i] = NULL
来帮助我识别文件名。 -
和/
对文件名和标志有效。
编辑2
该标准涉及argv
和the strings pointed to by the argv array
。那些可以修改。但指针本身呢?标准是否明确表示可以修改它们?还是我误解了标准?
答案 0 :(得分:1)
我不确定你想做什么,但没有什么可以阻止你使用额外的阵列存储你设置的标志,而不是清除argv[i]
!
答案 1 :(得分:0)
argv数组指向的字符串
我认为你错了。
argv
是 NOT 一个字符指针数组
argv
是指针
字符指针 ,它是char
数组的第一个元素 - 指针(通常称为argv
数组),包含参数,每个字符串一个。
因此修改任何有效的argv[i]
都没有问题。
答案 2 :(得分:0)
将argv
传递到main方法后,您可以像对待任何其他C数组一样对待它 - 根据需要随意更改它,只需知道您正在使用它做什么。除了你在程序中使用它之外,它不会影响执行。
请记住argv
是null terminated
。
答案 3 :(得分:-6)
argv指向的指针以及这些指针中的字符是您的应用程序无法写入的。如果你修改它们会发生任何事情。当然,您可以自由复制argv数组,或者使用bool数组,或者您喜欢的任何其他方法。
不要写信给argv [i]。