C中链表示例的奇怪核心转储错误

Weird core dumped error on linked list example in C

我有下面的程序。我想练习链表并尝试构建一个应用程序,该应用程序可以将输入到程序中的标志保存到链表中,我的所有控件都可以很好地处理这些标志,但是当我输入正确的所有内容而不是列出标志时,我得到了核心转储错误

--更新--

该程序应该检查提供给程序的标志是否有效或是否需要任何值,如果一切正常,它应该将键值对打印到控制台,这些键值对存储在链表中 我通过将 gcc test.c init.c 和 运行 调用为 ./a.out -test someParam

来编译程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "init.h"
//f for false t for true
const char *flgs[3][2] = {{"-test", "t"}, {"-hey", "f"}, {"-heydehey", "f"}};
int forEach(FLAGS *flags, void (*cb)(char *flag, char *vl)) {
  FLAGS *current = flags;
  if (current == NULL) {
    return -1;
  }
  while (current != NULL) {
    cb(current->flag, current->value);
    current = current->next;
  }
  return 0;
}
FLAGS *initArgs(int argc, char **argv) {
  if (argc < 2) {
    return NULL;
  }
  int flagsNum = 3;
  FLAGS *rtr = malloc(sizeof(FLAGS));
  if (rtr == NULL) {
    fprintf(stderr, "unable to allocate memory\n");
    exit(-1);
  }
  FLAGS *current = NULL;
  rtr->next = current;
  bool invalidFlag = true;
  bool skipNext = false;
  for (int i = 1; i < argc; i++) {
    if (skipNext) {
      skipNext = false;
      continue;
    }
    invalidFlag = true;
    if (argv[i][0] == '-') {
      // if flag
      current = malloc(sizeof(FLAGS));
      for (int f = 0; f < 3; f++) {
        if (!strcmp(argv[i], flgs[f][0])) {
          invalidFlag = false;
          if (flgs[f][1] == "t") {
            if (i + 1 == argc || argv[i + 1][0] == '-') {
              fprintf(stderr, "flag %s requires a value ,none given\n", argv[i]);
              exit(-1);
            }
            current->value = argv[i + 1];
            current->next = NULL;
            current = current->next;
            skipNext = true;
          }
          current->flag = argv[i];
        }
      }
      if (invalidFlag) {
        fprintf(stderr, "\x1B[31minvalid flag %s\n", argv[i]);
        exit(-1);
      }
    }
  }
  return rtr;
}

这是我的 init.h 和 test.c 文件

test.c

#include <stdio.h>
#include <stdlib.h>
#include "init.h"
void cb(char *, char *);
int main(int argc, char **argv) {
  FLAGS *entered = initArgs(argc, argv);
  if (entered == NULL) {
    fprintf(stderr, "an error occured\n");
    return -1;
  }
  forEach(entered, &cb);
  return 0;
}
void cb(char *fl, char *val) { printf("flag=%s; value=%s;\name", fl, val);
 }

init.h

#define true 1
#define false 0
typedef int bool;
typedef struct values {
  char *flag;
  char *value;
  struct values *next;
} FLAGS;
extern const char *flgs[3][2];
int forEach(FLAGS *, void (*cb)(char *, char *));
FLAGS *initArgs(int argc, char **argv);

看看这些行和我的评论:

        current->next = NULL;      // Here current->next becomes NULL
        current = current->next;   // so here current becomes NULL
        skipNext = true;
      }
      current->flag = argv[i];     // So here you dereference NULL

因此你得到一个核心转储。