繁体   English   中英

使用 argv[1] 时出现分段错误

[英]segmentation fault when using argv[1]

当我尝试使用以下命令运行此程序时:./prog_name eventCNT 我遇到分段错误错误,而其他参数则一切正常...

    int main(int argc, char *argv[]) {

    printf("Application for up/down/random counter on 7 seg display\n");

    if ( (strcmp(argv[1], "eventCNT") == 0 &&  argc != 2) || (strcmp(argv[1], "eventCNT") != 0 &&  argc != 3) )

    {

        printf( "usage: %s <direction or event counting> <delay>\n", argv[0] );
        printf( "valid direction : up, down, updown, random\n");
        printf( "valid event counting : eventCNT\n");
        printf ("recommended delay range in ms : 0 to 1000\n");
    }
    else
    {
        .
       .
       .  

    }
}

您应该在访问argv之前检查argc

如果argc == 1并且您首先访问argv[1] ,则您正在访问无效内存,因为argv只有一个成员,即argv[0]

C++ 从左到右评估语句,因此首先具有未定义的行为然后检查是否可以这样做并不是最好的方法。 将检查反转为argcargv

实际上,您应该以更具防御性的方式编写代码,例如

if (argc < 2)
{
   // Error, not enough arguments
   return -1
}

// From here you know that argv[1] will be a valid string to something and you can freely get `argv[1]`

你应该使用

if (argc >= 2 && strcmp(argv[1], "eventCNT") == 0)

不是

if (strcmp(argv[1], "eventCNT") == 0 && argc != 2)

因为如果arguments小于2, argv[1]没有定义,会指向一个随机的内存地址。 因此出现分段错误。

如果您指向的不是以空字符结尾的字符串,那么strcmp也有未定义的行为。 在这里看到strcmp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM