分配argv [i] = NULL

时间:2015-07-13 11:16:17

标签: c argv

在阅读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。)

  1. 支持以这种方式重新分配argv[i]有哪些证​​据(如果有的话)?我担心我可能会导致内存和/或编译器问题,因为我不能保证其他系统如何处理这个问题。

  2. 有没有更好的方法来做我想做的事情?

  3. 修改

    我忘了添加输入参数由标志和文件名组成。这些可以是任何顺序,所以我使用argv[i] = NULL来帮助我识别文件名。 -/对文件名和标志有效。

    编辑2

    该标准涉及argvthe strings pointed to by the argv array。那些可以修改。但指针本身呢?标准是否明确表示可以修改它们?还是我误解了标准?

4 个答案:

答案 0 :(得分:1)

我不确定你想做什么,但没有什么可以阻止你使用额外的阵列存储你设置的标志,而不是清除argv[i]

答案 1 :(得分:0)

  

argv数组指向的字符串

我认为你错了。

argv NOT 一个字符指针数组

argv 指针 字符指针 ,它是char数组的第一个元素 - 指针(通常称为argv数组),包含参数,每个字符串一个。

因此修改任何有效的argv[i]都没有问题。

答案 2 :(得分:0)

argv传递到main方法后,您可以像对待任何其他C数组一样对待它 - 根据需要随意更改它,只需知道您正在使用它做什么。除了你在程序中使用它之外,它不会影响执行。

请记住argvnull terminated

答案 3 :(得分:-6)

argv指向的指针以及这些指针中的字符是您的应用程序无法写入的。如果你修改它们会发生任何事情。当然,您可以自由复制argv数组,或者使用bool数组,或者您喜欢的任何其他方法。

不要写信给argv [i]。