Ezért hasznos a Valgrind. Végül sikerült leszűkítenem a hibát az explode függvényemre. Rájönni nem sikerült, hogy mi az istentől corruptálja el a stacket, de végül felszívtam magam és megírtam újra az egész függvényt, egy másik szemlélettel, így most nem corruptál.#include <stdint.h>
#include <stdlib.h>
char **explode(char *text, char *separator, uint32_t *count, size_t len)
{
char **result;
uint32_t i, j, k, l, c, sl;
uint32_t *poses, *stops, *tmp;
*count = 0;
if ((separator == NULL) || (text == NULL))
{
return NULL;
}
c = 1;
sl = strlen(separator);
l = len == (size_t)-1 ? strlen(text) : len;
poses = malloc(sizeof(uint32_t));
if (poses == NULL)
{
return NULL;
}
stops = malloc(sizeof(uint32_t));
if (stops == NULL)
{
free(poses);
return NULL;
}
poses[0] = 0;
stops[0] = l - 1;
if (sl > 0)
{
i = 0;
while (i < l)
{
if (text[i] == separator[0])
{
j = 0;
while ((i + j < l) && (j < sl) && (text[i + j] == separator[j]))
{
++j;
}
if (j == sl)
{
stops[c - 1] = i + j - sl;
c++;
tmp = realloc(poses, c * sizeof(uint32_t));
if (tmp == NULL)
{
free(poses);
free(stops);
return NULL;
}
poses = tmp;
tmp = realloc(stops, c * sizeof(uint32_t));
if (tmp == NULL)
{
free(poses);
free(stops);
return NULL;
}
stops = tmp;
poses[c - 1] = i + j;
i += j;
--i;
}
}
++i;
}
stops[c - 1] = i;
result = malloc(sizeof(char **) * c);
if (result != NULL)
{
for (i = 0; i < c; ++i)
{
result[i] = malloc((stops[i] - poses[i]) + 1);
if (result[i] == NULL)
{
for (j = 0; j < i; ++j)
{
free(result[j]);
}
free(poses);
free(stops);
free(result);
return NULL;
}
k = 0;
for (j = poses[i]; j < stops[i]; ++j)
{
result[i][k++] = text[j];
}
result[i][k] = 0;
}
}
*count = c;
}
else
{
result = malloc(sizeof(char **));
if (result != NULL)
{
result[0] = malloc(l + 1);
memcpy(result[0], text, l);
result[0][l] = 0;
*count = 1;
}
}
if (poses != NULL)
{
free(poses);
free(stops);
}
return result;
} |