【问题标题】:Segmentation Fault with else statement带有 else 语句的分段错误
【发布时间】:2015-02-15 02:39:21
【问题描述】:

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

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)

为什么它落到else时会失败,而不是当它有参数时?

【问题讨论】:

  • 如果您没有传递参数,那么当argv[1] 为NULL 时,您正在执行strcmp(argv[1], "help"),这很糟糕。您需要检查argc 的参数,并避免访问不存在的argv 值。
  • 这个(argc, argv) != 0 不比较这两个值。

标签: c gcc memory arguments argv


【解决方案1】:

如果你没有传递参数,那么当 argv[1] 为 NULL 时,你正在做 strcmp(argv[1], "help"),这很糟糕。您需要检查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。)

【讨论】:

  • 致 OP:argv[0] 始终是程序的名称; main,就你而言。
  • 也可以有argc == 0,在这种情况下argv[1]是未定义的
  • @MattMcNabb 如果argc == 1,则没有命令行参数并且argv[1] 未定义。 “第一个”参数是命令本身,是argv[0],对应于argc == 1。尽管在某些情况下,一个程序可以执行另一个程序并具有argv[0] NULL 和argc == 0
  • @lurker argv[argc] 始终为 NULL,因此如果 argc == 1argv[1] 为 NULL,argv[0] 应包含命令行。
  • @MattMcNabb,是的,我知道这一点。我相信我的评论与此一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多