我正在尝试编写一个崩溃的简单C程序。如果没有提供输入,我希望下面的一个崩溃。
#include <stdlib.h>
int main(int argc, char * arg[]){
if (argc < 1){
abort();
}
}
我使用gcc编译了这个程序,然后用./a.out运行它,但没有任何反应,没有崩溃。知道为什么吗?谢谢。
答案 0 :(得分:4)
有效。但是,无论何时从 shell 以./a.out
运行它,它都会有一个参数 - 程序名称。 C标准(C11 5.1.2.2.1p2说明如下:
- 醇>
如果声明它们,主函数的参数应遵循以下约束:
argc
的值应为非负。 [即&gt; = 0!][...]
- 如果
argc
的值大于零,则argv[0]
指向的字符串代表程序名称;如果程序名不能从主机环境获得,则 argv [0] [0] 应为空字符。 [...]
即。 C标准允许argc
为&lt; 1 {}。 1,如果它正是0
。
实际上,至少在Linux中运行一个带有零参数的C程序,有点破解 - 从另一个用空参数调用execv
的程序执行它列表:
abort.c:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char * arg[]){
printf("argc is %d\n", argc);
if (argc < 1){
abort();
}
}
runner.c:
#include <unistd.h>
int main(void) {
char *args[] = { NULL };
execv("./abort", args);
}
然后:
% gcc abort.c -o abort
% gcc runner.c -o runner
现在如果你直接运行abort
,你就会得到:
% ./abort
argc is 1
然而,runner
:
./runner
argc is 0
Aborted (core dumped)
答案 1 :(得分:1)
它不会崩溃,因为argc
是参数计数,当您执行./a.out
argc
值的程序为1
时。所以不要检查
if (argc < 1){ /* 1<1 condition fails */
abort();
}
检查
if (argc == 1){
abort();
}
如果没有提供输入,我希望下面的一个崩溃。 ?为什么你希望它通过调用abort()
来崩溃,exit(0)
是一个好主意,它清理所有内容并正常终止进程。