2015-04-01 76 views
-3
$hoho 

a 

b 

abcd 

$hoho | lala 

segmentation fault 

lala.c - >爲什麼 '分段故障' 發生在下面的C代碼

#include<stdio.h> 
int main(int argc, char* argv){ 

printf("%s\n", argv[1]); 

... 
} 

那麼,我該怎麼使用std_input a,b和ABCD

+0

替換下面的行

printf("%s\n", argv[1]); 

'argv'包含*命令行參數*,而不是STDIN。 – Biffen 2015-04-01 11:29:15

+0

'$ hoho | xargs lala' – BLUEPIXY 2015-04-01 11:31:40

回答

1

在你lala.c(我希望實際的文件沒有命名這樣),

printf("%s\n", argv[1]); 

你使用argv[1]沒有檢查它的有效性。它很可能是NULL或未經初始化或不存在。這調用undefined behaviour

因此,在使用之前argv[n],你必須始終把支票像

if (argc < (n+1)) 
    //abort 
else 
    //use upto argv[n] 

除此之外,正如指出我@Iharob鋁Asimi先生char* argvchar* argv[]char ** argv。 (儘管如此,我認爲這更像是你的代碼中的一個錯字)。

1
  1. 您的main()有錯誤的簽名。這不是

    int main(int argc, char* argv) 
    

    int main(int argc, char **argv) 
    

    或等價

    int main(int argc, char *argv[]) 
    
  2. 你要打印與"%s"符一個char,該printf()函數試圖讀取一個字符串並解釋char作爲地址的值,因爲它期待char指針,這導致未定義的行爲並因此導致該問題。


請仔細閱讀張貼@SouravGhosh以及他的答案的鏈接,這也是很好的建議。

1

在你的代碼中,行

int main(int argc, char* argv){ 

改變

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

,如果你想多arguements這將是有效的。其次在打印之前檢查參數計數。因此,與

if(argc > 1) 
    printf("%s\n", argv[1]);