2012-01-11 84 views
1

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

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

输出:(null) 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; 
    } 
+1

有问题吗?当j == 10时,你赋值给b [10],但b只有10的大小,所以你正在分配超出b的范围。 – 2012-01-11 21:54:04

+0

请注意,传递带有“%s”格式空指针的行为是未定义的。你的实现恰好足够友好来打印'“(null)”;其他人不一定会那样做。 – 2012-01-11 21:58:27

+0

在我的设置(Visual Studio 2010)中,它工作。但@WilliamPursell是对的,foo的地址可能只是在酒吧之后,所以bar [10]指向foo。 – holgac 2012-01-11 21:59:29

回答

5

在你写NULLbar[10]循环的结束,而你却只能分配bar[0 - 9]。这可能会覆盖foo

+0

未定义的行为FTW。 – 2012-01-11 21:57:30

+0

谢谢。我试图将数组的结尾设置为NULL。那么我需要为阵列分配11还是? – Lucas 2012-01-11 21:59:31

+1

是的,如果您在最后放置了标记值,则必须为其分配额外的空间。 – 2012-01-11 22:02:34

4

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

-1

尝试

而(--argc)把(* ++的argv);