[C] Dynamiczna alokacja i zwalnianie pamięci

letta
Użytkownik
Użytkownik
Posty: 44
Rejestracja: 15 maja 2011, o 13:44
Płeć: Kobieta
Podziękował: 15 razy

[C] Dynamiczna alokacja i zwalnianie pamięci

Post autor: letta »

Hej
Mam kilka pytań, co do alokacji i zwalniania pamięci.
Nie wiem czym (i czy w ogóle) różnią się dwa poniższe zapisy i od czego zależy kiedy którego powinno się używać:
1.

Kod: Zaznacz cały

tab = (int*)malloc(n * sizeof(int)); 
2.

Kod: Zaznacz cały

tab = malloc(n * sizeof(int));
Podobny problem mam ze zwalnianiem pamięci. W kilku różnych opracowaniach znalazłam takie zapisy:
1.

Kod: Zaznacz cały

free(tab);
tab=NULL;

2.

Kod: Zaznacz cały

free(tab);
tab=tab;
3.

Kod: Zaznacz cały

free(tab);
Czym one się różnią i od czego zależy kiedy którego powinnam użyć? Do czego służą drugie linijki w tych pierwszych dwóch?
Z góry dziękuję za pomoc
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Dynamiczna alokacja i zwalnianie pamięci

Post autor: kalwi »

letta pisze:Nie wiem czym (i czy w ogóle) różnią się dwa poniższe zapisy i od czego zależy kiedy którego powinno się używać:
1.

Kod: Zaznacz cały

tab = (int*)malloc(n * sizeof(int)); 
2.

Kod: Zaznacz cały

tab = malloc(n * sizeof(int));
To jest po prostu rzutowanie zmiennej wskaźnikowej na typ

Kod: Zaznacz cały

int *
z typu

Kod: Zaznacz cały

void *
Krótko mówiąc - trzeba było tak robić w starszych wersjach C, ale od zdaje się C99 już nie trzeba, a nawet jest to niezalecane. Dlatego możesz ten nawias przed mallociem pomijać.
letta pisze:Podobny problem mam ze zwalnianiem pamięci. W kilku różnych opracowaniach znalazłam takie zapisy:
1.

Kod: Zaznacz cały

free(tab);
tab=NULL;

2.

Kod: Zaznacz cały

free(tab);
tab=tab;
3.

Kod: Zaznacz cały

free(tab);
Czym one się różnią i od czego zależy kiedy którego powinnam użyć? Do czego służą drugie linijki w tych pierwszych dwóch?
Z góry dziękuję za pomoc
To drugie jest bez sensu.
co do 1. i 3., przeanalizuj sobie taki kod

Kod: Zaznacz cały

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

int main()
{
	int *x = malloc(sizeof(int));
	*x = 5;
	free(x);
	//x = NULL;
	if(x != NULL)
	{
		*x = 1;
		printf("%d", *x);
	}
	return 0;
}
jest to po prostu dobra praktyka, aby tworzyć bezpieczny kod i uniknąć czegoś takiego jak powyżej.
ODPOWIEDZ