使用else语句进行分段错误

时间:2015-02-15 02:39:22

标签: c gcc memory arguments argv

当我使用这个编译器命令时:

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)

为什么它落入其他地方时失败而不是它有争论?

1 个答案:

答案 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。)