Segfault为无效的长选项

2ma*_*mac 1 c getopt getopt-long segmentation-fault command-line-arguments

我有以下代码:

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);
          }
      }
  }
Run Code Online (Sandbox Code Playgroud)

为什么带有--versio(故意拼写错误)的参数会导致段错误但是-a(这也是一个无效选项)只是在屏幕上打印"无效选项"消息?

Ewa*_*lor 7

您必须longopts使用全零的条目终止数组,否则getopt_long不知道它何时结束.你的代码崩溃了,因为getopt_long它只是在那个时候通过随机内存进行迭代,因为它已经脱落了longopts.

struct option longopts[] =
  {
    {"version", no_argument, NULL, 'v'},
    {NULL, 0, NULL, 0}
  };
Run Code Online (Sandbox Code Playgroud)