为什么 '分段故障' 发生在下面的C代码
问题描述:
$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