LINUX.ORG.RU

Очистка памяти после создания двумерного «непрерывного в памяти» массива

 , , , ,


2

2

«Я познаю мир», это главный тэг этой записи.

Допустим, хочется в C99 (в С++ такой способ тоже сработает) хочется создать двумерный массив в «непрерывной!» области памяти, чтобы в дальнейшем обращаться к его элементам как a[i][j]:

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

int main()
{
int n = 12;

double (*a)[n] = (double (*)[n])malloc(n * n *  sizeof(double))

a[11][0] = 40.0;
printf("a[11][0] = %4.2f\n", a[11][0]);
// выход за границу массива с заползанием в следующий блок:
a[10][12] = 50.0;
printf("a[11][0] = %4.2f\n", a[11][0]);
printf("a[10][12] = %4.2f\n", a[10][12]);

return 0;
}

Подскажите, кто-нибудь, пожалуйста, как при помощи free() очистить память выделенного таким образом массива?

P.S. Казалось бы, что при создании подобного массива можно было бы описать его так:

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

int main()
{
int n = 12;

// при присваивании, не выходя за границу массива, можно перезаписывать другие элементы:
double (*b)[1] = (double (*)[1])malloc (n * n * sizeof(double));
b[11][0] = 40.0;
printf("\nb[11][0] = %4.2f\n", b[11][0]);
// перезаписывает значение b[11][0]:
b[5][6] = 50.0;
printf("b[11][0] = %4.2f\n", b[11][0]);
printf("b[5][6] = %4.2f\n", b[5][6]);

return 0;
}

★★★★★

Последнее исправление: grem (всего исправлений: 2)

Ответ на: комментарий от yoghurt

дык кастануть плоский буфер к указателю на массив вполне вариант. сишечка же, какой класс.

vvviperrr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.