当我尝试使用以下程序运行该程序时:./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
{
.
.
.
}
}
答案 0 :(得分:2)
您应先检查argc
,然后再访问argv
如果argc == 1
并且您首先访问argv[1]
,则您正在访问无效的内存,因为argv
只有一个成员,即argv[0]
C ++从左到右评估语句,因此首先具有未定义的行为,然后检查是否可以这样做不是最佳方法。将支票反转为argc
和argv
实际上,您应该以更具防御性的方式编写代码,例如
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]`
答案 1 :(得分:1)
您应该使用
if (argc >= 2 && strcmp(argv[1], "eventCNT") == 0)
不是
if (strcmp(argv[1], "eventCNT") == 0 && argc != 2)
因为如果参数小于2,则未定义argv[1]
,因此将指向随机存储器地址。因此发生分段错误。
如果您指向非空终止字符串,strcmp
也具有未定义的行为。参见strcmp here