Неопределенность в отношении ошибки сегментации - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над стеком ADT и пытаюсь выполнить команду stack_pu sh (помещая элемент поверх стека). Обратите внимание, что вместо стека с целыми числами я работаю со строками. Вот что у меня есть:

char *strdup(const char *s) {
  char *new = malloc((strlen(s) + 1) * sizeof(char));
  strcpy(new, s);
  return new;
}

void stack_push(const char *str, struct stack *s) {
  assert(s);
  assert(str);
  char *copied_str = strdup(str);
  if (s->len == s->maxlen) {
    s->maxlen *= 2;
    s->data = realloc(s->data, (sizeof(s->data) +
                       ((strlen(str) + 1) * sizeof(char))));
  }
  strcpy(s->data[s->len], copied_str);
  s->len += 1;
}

Кроме того, моя реализация стека просто:

struct stack {
  char **data;
  int len;
  int maxlen;
};

Когда я запускаю это, моя функция strcpy (с третьей до последней строки stack_pu sh) выдает ошибку памяти, в частности, segmentation-fault-on-null-address, и я понятия не имею, почему это происходит. У меня уже есть строка ADT, включенная в мой код, поэтому функции, такие как strlen, strcmp и даже strcpy, уже должны быть здесь.

Может кто-нибудь помочь мне разобраться в моей проблеме?

1 Ответ

0 голосов
/ 08 апреля 2020

Размер, переданный на ваш realloc вызов, неверен. Поскольку вы хотите иметь возможность хранить maxlen строки в s->data, при вычислении размера следует использовать эту переменную. В частности, размер для выделения должен быть sizeof(*s->data) * s->maxlen

...