fork(1) download
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. // Функция принимает себе указатель на строку, разделитель и возвращает массив строк
  6. // string - строка которую нужно разделить
  7. // delimiter - разделитель
  8. // countString - возвращает колличество строк в массиве
  9. char** split(char * string, const char * delimiter, int * countString)
  10. {
  11. char *token, *last;
  12. char ** arrayString; // Массив строк, возвращаемый в конце функции
  13. char * str; // переменная нужна для создания копии строки для разделения в куче
  14. int count; // Текущее количества строк в массиве
  15. int count_malloc; // Это для примера, задает размер arrayString ( в будущем будет по другому )
  16.  
  17. count = 0;
  18. count_malloc = 10;
  19. arrayString = (char**)malloc(count_malloc * sizeof(char*)); // выделяем память для массива строк
  20. str = (char*)malloc(strlen(string)+1); // Выделяем память для копии строки
  21. strcpy(str,string); // создаем копию строки в куче
  22.  
  23. // Начинается разделение
  24. token = strtok_r(str, delimiter, &last);
  25. while (token != NULL) {
  26. arrayString[count] = (char*) malloc(strlen(token)+1); // Выделяется память для текущего токена
  27. strcpy( arrayString[count] ,token); // копируем токкен в массив
  28. token = strtok_r(NULL, delimiter, &last);
  29. count++;
  30. }
  31.  
  32. free(str); // !!! Выдает ошибку double free or corruption
  33.  
  34. *countString = count;
  35. return arrayString;
  36. }
  37.  
  38. int main(int count, char ** arg) {
  39. int countString;
  40. char ** arrayString;
  41.  
  42. arrayString = split("param1 param2 param3 param4 param5 param6", " ",&countString);
  43.  
  44. for(int i = 0; i < countString; i++) {
  45. printf ("%i: %s\n",i, arrayString[i]);
  46. }
  47.  
  48. // free отрабатывает нормально
  49. for(int i = 0; i < countString; i++) {
  50. free(arrayString[i]);
  51. }
  52.  
  53. // !!! Ошибка free(): invalid next size (fast)
  54. free(arrayString);
  55. return 0;
  56. }
Success #stdin #stdout 0s 2288KB
stdin
Standard input is empty
stdout
0: param1
1: param2
2: param3
3: param4
4: param5
5: param6