У вас есть только 4 malloc
звонки, поэтому вы должны иметь только 4 free
звонки.Вы никогда ничего не выделяли в цикле, так почему вы освобождаете в цикле?
part1[k]
и part2[k]
никогда не выделялись сами по себе, они просто указывают на область памяти, выделенную для one
, так что вы должны просто бесплатно one
.Кроме того, здесь есть утечка памяти:
one = malloc(sizeof(&one) * nx * nx);
part1 = malloc(sizeof(&part1) * nx);
...
// *** You just lost the previous old pointer here *** //
one = malloc(sizeof(&one) * nx * nx);
part2 = malloc(sizeof(&part2) * nx);
Причина, по которой ваш код работает для k = 0
, заключается в том, что part1[0] == &one[0] == one
, то есть part1[0]
фактически указывает на начало блока one
-освобождая это, вы освобождаете весь блок.
И я не уверен, что означает ваш sizeof
.Я предполагаю, что вы хотели выделить nx * nx
с плавающей точкой - если это так, это должно быть sizeof(*one)
- *one
это число с плавающей точкой, но &one
это адрес one
, то есть float **
указатель.
Вы действительно хотите сделать что-то вроде этого:
one1 = malloc(sizeof(*one) * nx * nx);
part1 = malloc(sizeof(*part1) * nx);
...
for(k = 0; k < nx; k++)
part1[k] = &one1[k * nx];
...
free(part1);
free(one1);