#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// Функция принимает себе указатель на строку, разделитель и возвращает массив строк
// string - строка которую нужно разделить
// delimiter - разделитель
// countString - возвращает колличество строк в массиве
char** split(char * string, const char * delimiter, int * countString)
{
char *token, *last;
char ** arrayString; // Массив строк, возвращаемый в конце функции
char * str; // переменная нужна для создания копии строки для разделения в куче
int count; // Текущее количества строк в массиве
int count_malloc; // Это для примера, задает размер arrayString ( в будущем будет по другому )
count = 0;
count_malloc = 10;
arrayString
= (char**)malloc(count_malloc
* sizeof(char*)); // выделяем память для массива строк str
= (char*)malloc(strlen(string
)+1); // Выделяем память для копии строки strcpy(str
,string
); // создаем копию строки в куче
// Начинается разделение
token = strtok_r(str, delimiter, &last);
while (token != NULL) {
arrayString
[count
] = (char*) malloc(strlen(token
)+1); // Выделяется память для текущего токена strcpy( arrayString
[count
] ,token
); // копируем токкен в массив token = strtok_r(NULL, delimiter, &last);
count++;
}
free(str
); // !!! Выдает ошибку double free or corruption
*countString = count;
return arrayString;
}
int main(int count, char ** arg) {
int countString;
char ** arrayString;
arrayString = split("param1 param2 param3 param4 param5 param6", " ",&countString);
for(int i = 0; i < countString; i++) {
printf ("%i: %s\n",i
, arrayString
[i
]); }
// free отрабатывает нормально
for(int i = 0; i < countString; i++) {
}
// !!! Ошибка free(): invalid next size (fast)
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLy8g0KTRg9C90LrRhtC40Y8g0L/RgNC40L3QuNC80LDQtdGCINGB0LXQsdC1INGD0LrQsNC30LDRgtC10LvRjCDQvdCwINGB0YLRgNC+0LrRgywg0YDQsNC30LTQtdC70LjRgtC10LvRjCDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQvNCw0YHRgdC40LIg0YHRgtGA0L7QugovLyBzdHJpbmcgLSDRgdGC0YDQvtC60LAg0LrQvtGC0L7RgNGD0Y4g0L3Rg9C20L3QviDRgNCw0LfQtNC10LvQuNGC0YwKLy8gZGVsaW1pdGVyIC0g0YDQsNC30LTQtdC70LjRgtC10LvRjAovLyBjb3VudFN0cmluZyAtINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60L7Qu9C70LjRh9C10YHRgtCy0L4g0YHRgtGA0L7QuiDQsiDQvNCw0YHRgdC40LLQtQpjaGFyKiogc3BsaXQoY2hhciAqIHN0cmluZywgY29uc3QgY2hhciAqIGRlbGltaXRlciwgaW50ICogY291bnRTdHJpbmcpCnsKICAgIGNoYXIgKnRva2VuLCAqbGFzdDsKICAgIGNoYXIgKiogYXJyYXlTdHJpbmc7ICAgIC8vINCc0LDRgdGB0LjQsiDRgdGC0YDQvtC6LCDQstC+0LfQstGA0LDRidCw0LXQvNGL0Lkg0LIg0LrQvtC90YbQtSDRhNGD0L3QutGG0LjQuAogICAgY2hhciAqIHN0cjsgICAgICAgICAgICAgLy8g0L/QtdGA0LXQvNC10L3QvdCw0Y8g0L3Rg9C20L3QsCDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyDQutC+0L/QuNC4INGB0YLRgNC+0LrQuCDQtNC70Y8g0YDQsNC30LTQtdC70LXQvdC40Y8g0LIg0LrRg9GH0LUKICAgIGludCBjb3VudDsgICAgICAgICAgICAgIC8vINCi0LXQutGD0YnQtdC1INC60L7Qu9C40YfQtdGB0YLQstCwINGB0YLRgNC+0Log0LIg0LzQsNGB0YHQuNCy0LUgCiAgICBpbnQgY291bnRfbWFsbG9jOyAgICAgICAvLyDQrdGC0L4g0LTQu9GPINC/0YDQuNC80LXRgNCwLCDQt9Cw0LTQsNC10YIg0YDQsNC30LzQtdGAIGFycmF5U3RyaW5nICgg0LIg0LHRg9C00YPRidC10Lwg0LHRg9C00LXRgiDQv9C+INC00YDRg9Cz0L7QvNGDICkKCiAgICBjb3VudCA9IDA7CiAgICBjb3VudF9tYWxsb2MgPSAxMDsKICAgIGFycmF5U3RyaW5nID0gKGNoYXIqKiltYWxsb2MoY291bnRfbWFsbG9jICogc2l6ZW9mKGNoYXIqKSk7IC8vINCy0YvQtNC10LvRj9C10Lwg0L/QsNC80Y/RgtGMINC00LvRjyDQvNCw0YHRgdC40LLQsCDRgdGC0YDQvtC6CiAgICBzdHIgPSAoY2hhciopbWFsbG9jKHN0cmxlbihzdHJpbmcpKzEpOyAgICAgIC8vINCS0YvQtNC10LvRj9C10Lwg0L/QsNC80Y/RgtGMINC00LvRjyDQutC+0L/QuNC4INGB0YLRgNC+0LrQuAogICAgc3RyY3B5KHN0cixzdHJpbmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyDRgdC+0LfQtNCw0LXQvCDQutC+0L/QuNGOINGB0YLRgNC+0LrQuCDQsiDQutGD0YfQtQoKICAgIC8vINCd0LDRh9C40L3QsNC10YLRgdGPINGA0LDQt9C00LXQu9C10L3QuNC1CiAgICB0b2tlbiA9IHN0cnRva19yKHN0ciwgZGVsaW1pdGVyLCAmbGFzdCk7CiAgICB3aGlsZSAodG9rZW4gIT0gTlVMTCkgewogICAgICAgIGFycmF5U3RyaW5nW2NvdW50XSA9IChjaGFyKikgbWFsbG9jKHN0cmxlbih0b2tlbikrMSk7IC8vINCS0YvQtNC10LvRj9C10YLRgdGPINC/0LDQvNGP0YLRjCDQtNC70Y8g0YLQtdC60YPRidC10LPQviDRgtC+0LrQtdC90LAKICAgICAgICBzdHJjcHkoIGFycmF5U3RyaW5nW2NvdW50XSAsdG9rZW4pOyAgICAgICAgICAgICAgICAgICAvLyDQutC+0L/QuNGA0YPQtdC8INGC0L7QutC60LXQvSDQsiDQvNCw0YHRgdC40LIKICAgICAgICB0b2tlbiA9IHN0cnRva19yKE5VTEwsIGRlbGltaXRlciwgJmxhc3QpOwogICAgICAgIGNvdW50Kys7CiAgICB9CgogICAgZnJlZShzdHIpOyAvLyAgICEhISDQktGL0LTQsNC10YIg0L7RiNC40LHQutGDIGRvdWJsZSBmcmVlIG9yIGNvcnJ1cHRpb24KCiAgICAqY291bnRTdHJpbmcgPSBjb3VudDsKICAgIHJldHVybiBhcnJheVN0cmluZzsKfQoKaW50IG1haW4oaW50IGNvdW50LCBjaGFyICoqIGFyZykgewogICAgaW50IGNvdW50U3RyaW5nOwogICAgY2hhciAqKiBhcnJheVN0cmluZzsKCiAgICBhcnJheVN0cmluZyA9IHNwbGl0KCJwYXJhbTEgcGFyYW0yIHBhcmFtMyBwYXJhbTQgcGFyYW01IHBhcmFtNiIsICIgIiwmY291bnRTdHJpbmcpOwoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudFN0cmluZzsgaSsrKSB7CiAgICAgICAgcHJpbnRmICgiJWk6ICVzXG4iLGksIGFycmF5U3RyaW5nW2ldKTsKICAgIH0KCiAgICAvLyBmcmVlINC+0YLRgNCw0LHQsNGC0YvQstCw0LXRgiDQvdC+0YDQvNCw0LvRjNC90L4KICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudFN0cmluZzsgaSsrKSB7CiAgICAgICAgZnJlZShhcnJheVN0cmluZ1tpXSk7CiAgICB9CgogICAgLy8gISEhINCe0YjQuNCx0LrQsCBmcmVlKCk6IGludmFsaWQgbmV4dCBzaXplIChmYXN0KQogICAgZnJlZShhcnJheVN0cmluZyk7CiAgICByZXR1cm4gMDsKfQ==