2015-04-01 46 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]);