Вот ваша проблема:
for(j=0; j<n; j++);
// ^
{
(*((*(a + i))+j)) = (uint*) malloc(1 * sizeof(uint));
Эта дополнительная ;
в конце строки for
означает, что у вас есть цикл с пустым телом:
for(j=0; j<n; j++)
;
... с последующим единственным присваиванием:
(*((*(a + i))+j)) = (uint*) malloc(1 * sizeof(uint));
В этот момент j == n
(из-за предыдущего цикла), так что вы записываете за пределы.
Та же ошибка существуетдалее в вашем free
коде (копировать / вставить?).