当我使用这个编译器命令时:
gcc ../main.c -w -o sc
这段代码:
/* sc - a simple calculator */
/* glibc */
#include <stdio.h>
#include <stdlib.h>
/* global variables */
int ans;
void help()
{
printf("Type in an equation (2 + 2) and it will solve it. (4)\n");
printf("-- remember spaces between characters.\n");
}
void error()
{
printf("That value is not accepted.\n");
printf("---------------------------\n");
help();
}
int main(int argc, char *argv[])
{
if(strcmp(argv[1], "help") == 0) {
help();
} else if(argc == 4) {
if( /* Removed calculator function */ (argc, argv) != 0) {
error();
return 2;
}
} else {
error();
return 1;
}
return 0;
}
当我运行没有任何参数的二进制文件时,这是输出:
Segmentation fault (core dumped)
为什么它落入其他地方时失败而不是它有争论?
答案 0 :(得分:3)
如果您没有传递参数,那么当strcmp(argv[1], "help")
为NULL时,您正在执行argv[1]
,这很糟糕。您需要检查argc
是否存在参数,并避免访问不存在的argv
值。例如:
if ((argc >= 2) && (strcmp(argv[1], "help") == 0)) {
help();
} else if(argc == 4) {
如果argc
不是2
,那么argv[1]
将为NULL,strcmp
将为段错误。 (注意:argv[0]
是命令名本身,即可执行文件名,因此如果从命令行执行命令,arvc
应始终至少为1
。)