$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
$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
在你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* argv
應char* argv[]
或char ** argv
。 (儘管如此,我認爲這更像是你的代碼中的一個錯字)。
您的main()
有錯誤的簽名。這不是
int main(int argc, char* argv)
它
int main(int argc, char **argv)
或等價
int main(int argc, char *argv[])
你要打印與"%s"
符一個char
,該printf()
函數試圖讀取一個字符串並解釋char
作爲地址的值,因爲它期待char
指針,這導致未定義的行爲並因此導致該問題。
請仔細閱讀張貼@SouravGhosh以及他的答案的鏈接,這也是很好的建議。
在你的代碼中,行
int main(int argc, char* argv){
改變
int main(int argc, char *argv[]){
,如果你想多arguements這將是有效的。其次在打印之前檢查參數計數。因此,與
if(argc > 1)
printf("%s\n", argv[1]);
替換下面的行
'argv'包含*命令行參數*,而不是STDIN。 – Biffen 2015-04-01 11:29:15
'$ hoho | xargs lala' – BLUEPIXY 2015-04-01 11:31:40