2012-01-11 83 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);