освобождая тройной указатель - PullRequest
0 голосов
/ 28 мая 2018

После запуска этого (он прекрасно компилируется), я получаю «double free или коррупция», но только если я специально устанавливаю n как нечетное.Даже проблем нет, и я очень запутался ...

#include<stdio.h>
#include<stdlib.h>

typedef unsigned int uint;

int main(void)
{   
    int i, j;
    uint n = 3;

    uint*** a = (uint***) malloc( n* sizeof(uint**) );
    for(i=0; i<n; i++)
    {
        *(a + i) = (uint**) malloc( (n)* sizeof(uint*) );
        for(j=0; j<n; j++);
        {
            (*((*(a + i))+j)) = (uint*) malloc(1 * sizeof(uint));
        }
    }

    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++);
        {
            free (*((*(a + i))+j));
        }
        free (*(a + i));
    }
    free(a);
}

1 Ответ

0 голосов
/ 28 мая 2018

Вот ваша проблема:

    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 коде (копировать / вставить?).

...