为什么'分段错误'发生在以下C代码中

时间:2015-04-01 11:24:39

标签: c

$hoho

a

b

abcd

$hoho | lala

segmentation fault

lala.c - >

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

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

...
}

然后,我如何使用std_input a,b和abcd

3 个答案:

答案 0 :(得分: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 Al Asimi先生所指出的,char* argv应为char* argv[]char ** argv。 (我相信你的代码中更多的是拼写错误。)

答案 1 :(得分:1)

  1. 您的main()签名错误。这不是

    int main(int argc, char* argv)
    

    它的

    int main(int argc, char **argv)
    

    或等效

    int main(int argc, char *argv[])
    
  2. 您正在尝试使用char说明符打印"%s"printf()函数尝试读取字符串并将char值解释为地址因为它期望一个char指针,这会导致未定义的行为 1 ,从而导致问题。


  3. 1 请阅读@ SouravGhosh发布的链接以及他的答案,这也是一个很好的建议。

答案 2 :(得分:1)

在您的代码中,更改行

int main(int argc, char* argv){

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

如果你想要多个争论,这将是有效的。然后在打印之前检查参数计数。所以替换以下行

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

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