C:Malloc String Array混乱

时间:2016-02-04 23:04:51

标签: c arrays string cygwin malloc

我正在尝试分配足够的空间来以相反的顺序保存给定数组arg_list的所有命令行参数。

char* arg_list[6];
arg_list = malloc((sizeof(char*)) * argc);
for (i=argc; i < 0; i--)
{
    arg_list[i]=argv[i];  
}

我的理论是在malloc上获取sizeof一个char*,然后将其乘以给出的论数,argc给出所需的总空间量

然后使用for循环,以元素数量i开始argc,例如5,然后将argv的第5个元素放入arg_list中的第5个点{1}}并执行此操作直到达到0.

我收到incompatible implicit declaration的警告和assignment to expression with array type的错误,不知道我哪里出错了。此外,我现在已经使用C大约一天半了,如果可以的话,尽可能地减少所有东西!我真的很感激!

编辑:麻烦打印出反转阵列 代码:

    char** arg_list = malloc((sizeof(char*)) * argc);

/** arg_list points to the command-line arguments in the */
/**     reversed order */
for (i=argc-1; i >= 0; i -=1)
{
    arg_list[i]=argv[i];  
}

/** print the content of arg_list */
/** fill here */
for (i=0; i<argc; i++)
{
    printf(arg_list[i]);
    printf("\n");
}

我对如何打印逆序而感到困惑。每当我打印它时,它按正常顺序打印而不是反转。我对如何以正常顺序而不是反向放入arg_list感到困惑。谢谢!

3 个答案:

答案 0 :(得分:2)

宣布后

char* arg_list[6];

您无法为arg_list分配任何内容。您只能分配给它的元素。因此,

arg_list = malloc(...);

错了。您可以使用:

arg_list[0] = malloc(...);

但那不是你追求的目标。

您需要使用:

char** arg_list = malloc((sizeof(char*)) * argc);

答案 1 :(得分:1)

您想要char **arg_list;

此外,对于argc项,最大下标为[argc - 1],,因此您需要调整该循环。

答案 2 :(得分:1)

我正在回答已编辑的版本,其中已包含其他答案和评论的更正。

向后倾斜并看看

for ...
    arg_list[i] = argv[i];

因此,您将位置[i]的指针指定到位置[i]的指针:

arg_list[argc-1] = argv[argc-1];
...
arg_list[1] = argv[1];
arg_list[0] = argv[0];

现在想想逆转意味着......

试着跟着我。如果你完成了(无论成功与否)都会发表评论,我会提供完整的解决方案。但请先尝试自己,这非常简单,它将比完全呈现的解决方案更有帮助。

解决方案:您必须从不同方向索引两个数组:

for (int i = 0 ; i < argc ; i++ )
    arg_list[i] = argv[ argc - 1 - i];

我改为循环到更明显的递增循环,方向无关紧要。

请注意,最上面的条目的索引是argc - 1,而不是argc,就像在C中一样 - 在大多数编程语言中 - 索引从0开始。

警告:打印可变数据时,始终应使用printf&amp;的格式字符串。家庭。当prionting外部提供的数据(如命令行参数)时,这将成为必需的。没有做广泛的打开安全漏洞。试着考虑提供%s作为参数。这实际上导致:

printf("%s");

请注意,您没有提供必需的字符串参数,但printf尝试读取它。