Перераспределенный указатель не был выделен - PullRequest
1 голос
/ 01 мая 2019

Я хочу создать функцию, которая разделяет данную строку в соответствии с разделителем (winter-is-ближайшие -> зима | идет | идет) к своим подстрокам и возвращает нулевую строку в конце двухсимвольного указателя. Когда я запускаю этот код под Mac OS X в стандарте C90, я получаю первую строку как «зима» (~ как w, wi, win, wint, winte, winter ~, когда я печатаю temp в цикле), но затем она неожиданно обрывается и выдает эту ошибку:

untitled2(30275,0x109cf25c0) malloc: *** error for object 0x7fec9a400630: pointer being realloc'd was not allocated
untitled2(30275,0x109cf25c0) malloc: *** set a breakpoint in malloc_error_break to debug

Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char ** split(char *str, char delimeter) {
  int i = 0;
  int c = 0;
  int k = 1;
  char **result;
  result = (char **) malloc(sizeof(char*));
  *result = (char *) malloc(sizeof(char));
  char * temp;
  temp = *result;
  while (str[i] != '\0') {

    if (str[i] != delimeter) {
      *(temp + i) = *(str + i);
      i++;
      temp = (char *) realloc(*(result + c), sizeof(char) * (i + 1));
      continue;
    }

    else {
      c++;
      k++;
      result = (char **) realloc(result, sizeof(char *) * k);

      *(result + c) = (char*) malloc(sizeof(char));
      i++;
      *(temp + i) = '\0';

    }
  }
  printf("%s\n", result[0]);
  return result;
}

int main() {
  char *cpr;
  cpr = (char *) malloc(sizeof(char) * strlen("winter-is-coming"));
  strcpy(cpr, "winter-is-coming");
  printf("%s\n", split(cpr, '-')[0]);
  return 0;
}

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Недостаточное распределение - на 1.

A строка длины N потребности N+1 char.Приведение не требуется в C.

// cpr = (char *)malloc(sizeof(char)*strlen("winter-is-coming"));
cpr = malloc(strlen("winter-is-coming") + 1);
// Robust code would check for allocation success
if (cpr == NULL) {
  return EXIT_FAILURE;
}
strcpy(cpr,"winter-is-coming");

Код может не вернуть правильное указание количества разбиений от split().Для примера рассмотрим char ** split("", .-).Кроме того, printf("%s\n",result[0]); - это UB.


Могут существовать другие проблемы.

0 голосов
/ 01 мая 2019

Просто с первого взгляда я с подозрением отношусь к

result = (char **)malloc(sizeof(char*));

Я думаю, у вас должно быть что-то вроде

result = (char **)malloc(MAX_NUMBER_OF_DIFFERENT_SUBSTRINGS * sizeof(char*));

, имеет ли это смысл?

в противном случае

 *(result +c)

не имеет смысла ....

, поэтому попробуйте увеличить память, выделенную для результата ....

, но это, вероятно, только часть истории

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...