我有以下代码:

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(这也是一个无效选项)只是在屏幕上打印一条“无效选项”消息?

最佳答案

必须用一个全为零的条目终止longopts数组,否则getopt_long不知道它何时结束你的代码崩溃了,因为getopt_long只是在随机内存中迭代,因为它已经从longopts的末尾掉下来了。

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

关于c - 分段故障导致无效的多头期权,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30956582/

10-10 11:17