Angående free() i C

Tags:    c++

Jeg har et spørgsmål som drejer sig om free() i C. Jeg er rimelig ny indenfor C så det er blot et spørgsmål om den korrekte forståelse.

Lidt kode:

unsigned int ncols = 10;
unsigned int nrows = 10;

int **pptr = NULL;
int *ptr = NULL;

int main()
{
int i = 0;

pptr = (int **)malloc(ncols * nrows * sizeof(int));
if (pptr == NULL) exit(0);

ptr = (int *)malloc(nrows * sizeof(int *));
if (ptr == NULL) exit(0);

for (i = 0; i < nrows; i++)
{
ptr = pptr + (i * ncols);
}

free(pptr);
}

Mit spørgsmål tager udgangspunkt i brug af allokering med malloc. Koden foroven tager brug af pointer-pointer til oprettelse af 2-dim dynamisk array som størrelsesmæssigt sættes ved run-time. Mit spørgsmål er om jeg blot kan sige free(pptr), siden jeg ikke skal bruge den pointer som identifier i mit program længere. Skader det at have en pointer liggende? Problemet ligger i at jeg ikke direkte vil deallokere hukommelses områderne da jeg bruger dem via ptr-pointeren.

Er det usmart at bruge free() her, eller at det ligemeget. Vinder jeg noget ved det??

Mvh Intel4004

Jeg er Intel4004 på Eksperten.dk



4 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Man kan ikke allokere et 2D array.
Du er nødt til at gøre det i to trin:

int x;
int **pp = malloc(ncols * sizeof(int *));

for(x = 0; x < ncols; x++)
pp[x] = malloc(nrows*sizeof(int));

....
for(x = 0; x < ncols; x++)
free(pp[x]);

free(pp);

Hvis det er C++ skal du caste retur værdien fra malloc. Du bør tilføje fejl check.

For hver malloc() skal der være én free() af samme memory.

[Redigeret d. 13/05-04 20:37:23 af Bertel Brander]



Man kan ikke allokere et 2D array.


Du kan sagtens gøre dem som jeg gør det her - tjeck koden lidt og du vil se det.

Der er dog en fejl i for-løkken.

skulle være:

ptr[ i ] = pptr + (i * ncols);

Her er kan jeg blot nøjes med at bruge malloc() 2 gange :)

[Redigeret d. 13/05-04 22:14:59 af Intel4004]



Ja, nu giver det jo mening.

Du skal først free(pptr) når du er færdig med det hukommelse som pptr peger på, uanset om du sætter ptr til at pege på det.

Et komplet eksempel:
Fold kodeboks ind/udKode 





Man kan også nøjes med en malloc() og free():

Fold kodeboks ind/udKode 




t