从命令行参数动态分配字符串

时间:2014-10-04 17:58:34

标签: c string malloc

我希望处理一个通过命令行参数传递的字符串,并在C中使用for循环。我想知道这是否正确。

main(int argc, char * argv[])
{
    char * somestring;
    somestring = malloc( (strlen(argv[1]) + 1) * sizeof(char) );
    somestring = argv[1];

       ...
}

或者如果我这样做,C会分配适当的内存:

char * somestring;
somestring = argv[1];

4 个答案:

答案 0 :(得分:3)

如果要在自己分配的内存中复制参数,则必须编写

int main(int argc, char * argv[1])
{
    char * somestring;
    somestring = malloc( strlen( argv[1] ) + 1 );
    strcpy( somestring, argv[1] );

       ...
}

否则声明

    somestring = argv[1];

会导致内存泄漏。

也不要忘记在不再需要时释放内存。

考虑到这个记录

int main(int argc, char * argv[1])

有效,最好写

int main(int argc, char * argv[])

因为您指定char * argv[1]的意图不明确

答案 1 :(得分:1)

如果你需要保留一个瞬态字符串,那么你需要分配内存,将其复制到新缓冲区(通过strcpy - 类似函数),然后释放该缓冲区。

但在这种情况下,命令行参数不是瞬态的。它们可在整个生命周期内使用。因此,仅记住指向它们的指针就足够了。所以这样的事情就足够了:

const char* firstParameter = nullptr;

int main(int argc, char* argv[])
{
    if (argc > 1) firstParameter = argv[1];
}

答案 2 :(得分:0)

所有这些都是将字符串复制到另一个字符串的错误方法。 您已经正确地完成了内存分配,但是将字符串复制到另一个字符串的方法是错误的。您已为字符串分配内存并将其地址收集到somestring中。现在你要为它分配argv [1],它实际上是命令行参数向量的地址,它是2D数组。所以你应该使用strcpy()来复制字符串。

或者如果你只想要字符串的基地址使用char指针而是为它分配argv [1]。但这没用。

P.S。不建议传递命令行参数,因为所有参数都存储在参数向量argv中,即二维数组。因此,如果您只传递一个字符串,那么它没关系,但是如果您传递的是多个字符串,那么请使用char ** argv。

答案 3 :(得分:0)

一种好方法是为指针分配内存并使用strcpy函数来复制内容。

例如:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char * argv[])
{
    char *somestring;
    if(argv[1] == NULL)
    {
        puts("Argument 1 is not specified.");
        exit(1);
    }
    somestring = malloc( strlen(argv[1])+1 );
    strcpy(somestring, argv[1]);
    printf("%s\n",somestring);
    return 0;
}

在为指针分配内存之前,首先检查argv[1]是否不是NULL