В момента уча за указатели и разпределение на статична/динамична памет. В следния код имам 3D масив. Променливият масив е указател към указател към указател mat3***
. Научих, че malloc
разпределя памет от купчината и връща указател. Функцията free
освобождава тази памет.
int main()
{
double*** mat3;
int m,n,p;
int i,j,k;
m=2; n=3; p=4; /* unequal dimensions should work fine as well */
mat3 = (double***) malloc(m*sizeof(double**));
if (mat3 == NULL)
exit(1);
for (i=0; i<m; i++)
{
mat3[i] = (double**) malloc(n*sizeof(double*));;
if (mat3[i] == NULL)
exit(1);
for (j=0; j<n; j++)
{
mat3[i][j] = (double*) malloc(p*sizeof(double));
if (mat3[i][j] == NULL)
exit(1);
}
}
// Fill with some data that makes checking easy (value = sum of the indexes) :
for(i=0;i<m;i++)
for(j=0;j<n;j++)
for(k=0;k<p;k++)
mat3[i][j][k] = i + 10*j + 100*k;
show(mat3,m,n,p);
free(mat3);
}
Така че след показването приключих с 3D масива и искам да освободя паметта. Затова използвам free
, но наистина се съмнявам дали съм го направил правилно. Тъй като дадох команда за освобождаване на ***
, но самият **
и *
не бяха в команда. Така че това би означавало, че в купчината все още има указатели към указатели и самите указатели. Ако това е вярно, нямаше да знам как да освободя паметта, може би бих могъл да използвам същия цикъл, но тогава вместо да разпределя памет, бих могъл да я освободя.
Друг въпрос е по-скоро теоретичен. Тъй като освободих паметта, но паметта не се презаписва веднага. Ако използвам free()
преди printf()
, получавам грешка при сегментиране. Въпреки че паметта е освободена? Местоположението на физическата памет все още съществува, нали? Така че защо не можах да го осъществя с референтния адрес?
free()
освобождава, не преразпределя. Искате да освободите паметта. - person Marco Bonelli   schedule 10.10.2020m * n * p
записи и да индексирате в него с нещо катоi * (m + n) + j * n + k
... - person AKX   schedule 10.10.2020malloc
на измерение, но трябва също даfree
на измерение.free
не е рекурсивен. Вижте също това. - person ggorlen   schedule 10.10.2020