C字符串变为空

C字符串变为空,c,command-line-arguments,argv,C,Command Line Arguments,Argv,我正在学习如何在C中获取参数,但是,当我使用以下输入运行下面的代码时,第一个变为null 输入:/a.out a b c d e f g h i j k #include <stdio.h> int main(int argc, char *argv[]) { int i = 2, j = 0; char *foo = argv[1]; char *bar[10]; while(j < 10 &a

我正在学习如何在C中获取参数,但是,当我使用以下输入运行下面的代码时,第一个变为null

输入:
/a.out a b c d e f g h i j k

#include <stdio.h>

    int main(int argc, char *argv[])
    {
        int i = 2, j = 0;
        char *foo = argv[1];
        char *bar[10];
        while(j < 10 && i < argc)
        {
            bar[j++] = argv[i++];
        }
        bar[j] = NULL;

        printf("%s ", foo);
        for(j = 0; bar[j] != NULL; j++)
        {
            printf("%s ", bar[j]);
        }
        printf("\n");

        return 0;
    }
输出:
(空)b c d e f g h i j k

#include <stdio.h>

    int main(int argc, char *argv[])
    {
        int i = 2, j = 0;
        char *foo = argv[1];
        char *bar[10];
        while(j < 10 && i < argc)
        {
            bar[j++] = argv[i++];
        }
        bar[j] = NULL;

        printf("%s ", foo);
        for(j = 0; bar[j] != NULL; j++)
        {
            printf("%s ", bar[j]);
        }
        printf("\n");

        return 0;
    }
#包括
int main(int argc,char*argv[])
{
int i=2,j=0;
char*foo=argv[1];
字符*条[10];
而(j<10&&i
在循环结束时,您将
NULL
写入
条[10]
,但您只分配了
条[0-9]
。这可能会在循环结束时覆盖
foo

您将
NULL
写入
bar[10]
,但您只分配了
bar[0-9]
。这可能会覆盖
foo

您在循环结束时将bar[10]设置为NULL,但它只会上升到bar[9]。由于foo是在堆栈上的bar之后分配的,因此bar[10]=NULL会覆盖foo。

您在循环结束时将bar[10]设置为NULL,但它只会上升到bar[9]。由于foo是在堆栈上的bar之后分配的,因此bar[10]=NULL会覆盖foo。

试试看

而(--argc)put(*++argv)

试试看


而(--argc)put(*++argv)

有问题吗?当j==10时,将赋值给b[10],但b的大小仅为10,因此赋值超出了b的边界。请注意,使用
“%s”
格式传递空指针的行为未定义。您的实现恰好足够友好,可以打印
(null)
;其他人不一定会这样做。在我的设置(VisualStudio2010)中,它起了作用。但@williampersell是对的,foo的地址可能就在bar后面,所以bar[10]指向foo。有问题吗?当j==10时,将赋值给b[10],但b的大小仅为10,因此赋值超出了b的边界。请注意,使用
“%s”
格式传递空指针的行为未定义。您的实现恰好足够友好,可以打印
(null)
;其他人不一定会这样做。在我的设置(VisualStudio2010)中,它起了作用。但@williampersell是对的,foo的地址可能就在bar后面,所以bar[10]指向foo。谢谢。我试图将数组的结尾设置为NULL。然后我需要为数组分配11吗?是的,如果在末尾添加sentinel值,则必须为其分配额外的空间。谢谢。我试图将数组的结尾设置为NULL。然后我需要为数组分配11吗?是的,如果在末尾添加一个sentinel值,则必须为其分配额外的空间。