Возможно, вы перезаписываете память, которой не владеете. Я думаю, что в этом разделе:
// do things that set values to the Tile entity
вы делаете это:
tmpResult->iFrames = n;
for (i = 0 ; i < n ; ++n)
{
tmpResult->iTime [i] = <some value>;
}
что неправильно, вам нужно выделить отдельную память для массива:
tmpResult->iTime = malloc (sizeof (short int) * n);
прежде чем писать в него. Это делает освобождение объекта более сложным:
free (tile->iTime);
free (tile);
Либо сделайте следующее:
typedef struct {
unsigned short int iFrames;
unsigned short int iTime [1]; // array with elements [0..x] holding the timing for each frame
} Tile;
и malloc вот так:
tile = malloc (sizeof (Tile) + sizeof (short int) * (n - 1)); // -1 since Tile already has one int defined.
и цикл for остается прежним:
for (i = 0 ; i < n ; ++n)
{
tmpResult->iTime [i] = <some value>;
}
но освобождение плитки - это просто:
free (tile);
так как вы выделили только один кусок памяти, а не два. Это работает, потому что C (и C ++) не выполняет проверку диапазона для массивов.