бесплатный 2D массив, выделенный с помощью calloc - PullRequest
1 голос
/ 09 июля 2011

Я использую двумерный массив, и мне необходимо выделить его, как показано:

char ** buf; //global var

void allocate()
{
    buf = (char **) malloc (10 * sizeof (char*));
    char * data = (char *) calloc (1, 1000);
    int i;
    for(i=0; i<10; i++)
        buf[i] = &(data[i*100]);
}

int main()
{
    allocate();

    //something goes here

    free(buf[0]);
    free(buf);
    return 0;
}

Теперь, чтобы освободить массивы, поскольку я не могу получить доступ к переменной ' data ' в main () , я не могу сделать free (data) , следовательно Я делаю free (buf [0]) , предполагая, что я освобождаю весь массив из 1000 элементов. Это правильный способ сделать это? Освобождает ли (buf [0]) весь массив данных?

(Было бы удобно распределять каждый элемент buf как buf [i] = malloc (100), но я не могу этого сделать, так как у меня есть сначала для вызова большого блока).

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 09 июля 2011

Этот код правильный. Значение buf[0] равно &(data[0]), что по определению равно data. Это освободит всю выделенную память.

Обратите внимание, что если вы действительно хотите освободить один буфер, вы можете установить:

offset = 10*sizeof(char*);
buf = calloc(10*100+offset);

и в цикле сделать:

buf[i] = buf + offset + i*100;
3 голосов
/ 09 июля 2011

Вальгринд согласен с вами.Это правильно, потому что buf [0] содержит указатель на HEAD блока памяти calloc'd.

valgrind ./temp
==15404== Memcheck, a memory error detector
==15404== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==15404== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==15404== Command: ./temp
==15404== 
==15404== 
==15404== HEAP SUMMARY:
==15404==     in use at exit: 0 bytes in 0 blocks
==15404==   total heap usage: 2 allocs, 2 frees, 1,040 bytes allocated
==15404== 
==15404== All heap blocks were freed -- no leaks are possible
==15404== 
==15404== For counts of detected and suppressed errors, rerun with: -v
==15404== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 12 from 7)
3 голосов
/ 09 июля 2011

Это немного необычно, но это правильно. Вы сделали два распределения; Вы делаете два освобождения. И вы отпускаете указатели, которые были выделены. Все должно быть чисто.

Вы запускали valgrind в своей программе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...