1

я следующий код:Segfault для недействительной длинной опции

struct option longopts[] = 
    { 
    {"version", no_argument, 0, 'v'} 
    }; 

if (argc > 1) 
    { 
    int c; 
    int longindex; 
    while ((c = getopt_long (argc, argv, "v", longopts, &longindex)) != -1) 
     { 
     switch (c) 
      { 
      case 'v': 
      puts (VERSION_INFO); 
      exit (0); 

      case '?': 
      exit (1); 
      } 
     } 
    } 

Почему это с аргументом --versio (намеренно опечатка) будет вызывать Segfault но -a (который также является неверным вариантом) просто печатаю Сообщение "invalid option" на экране?

ответ

6

Вы должны завершить массив longopts с записью, в которой все нули, в противном случае getopt_long не знает, когда это закончится. Ваш код сбой, потому что getopt_long просто повторяет случайную память в этой точке, потому что он упал с конца longopts.

struct option longopts[] = 
    { 
    {"version", no_argument, NULL, 'v'}, 
    {NULL, 0, NULL, 0} 
    };