C Dinamiskās atmiņas piešķiršana, izmantojot malloc (), calloc (), free () & realloc ()

Šajā apmācībā jūs iemācīsities dinamiski piešķirt atmiņu savā C programmā, izmantojot standarta bibliotēkas funkcijas: malloc (), calloc (), free () un realloc ().

Kā jūs zināt, masīvs ir fiksēta vērtību skaita kolekcija. Kad masīva lielums ir deklarēts, to vairs nevar mainīt.

Dažreiz jūsu deklarētā masīva lielums var būt nepietiekams. Lai atrisinātu šo problēmu, izpildes laikā varat manuāli piešķirt atmiņu. Tas ir pazīstams kā dinamisks atmiņas sadalījums C programmēšanā.

Lai sadalītu atmiņas dinamiski, bibliotēkas funkcijas ir malloc(), calloc(), realloc()un free()tiek izmantoti. Šīs funkcijas ir definētas galvenes failā.

C malloc ()

Nosaukums "malloc" apzīmē atmiņas piešķiršanu.

malloc()Funkcija patur bloku atmiņā norādīto baitu skaitu. Tas atgriež rādītāju, voidkuru var iemest jebkuras formas rādītājos.

Malloka sintakse ()

 ptr = (castType*) malloc(size);

Piemērs

 ptr = (float*) malloc(100 * sizeof(float));

Iepriekš minētais paziņojums piešķir 400 baitus atmiņas. Tas ir tāpēc, ka lielums floatir 4 baiti. Rādītājs ptr piešķir atvēlētajā atmiņā pirmā baita adresi.

Izteiksmes rezultāts ir NULLrādītājs, ja atmiņu nevar piešķirt.

C calloc ()

Nosaukums "calloc" apzīmē blakus piešķiršanu.

malloc()Funkcija piešķir atmiņas un lapas atmiņas neinicializētu. Tā kā calloc()funkcija piešķir atmiņu un inicializē visus bitus līdz nullei.

Calloc () sintakse

 ptr = (castType*)calloc(n, size);

Piemērs:

 ptr = (float*) calloc(25, sizeof(float));

Iepriekš minētais paziņojums atdala atmiņā blakus esošo vietu 25 tipa elementiem float.

Bez C ()

Dinamiski piešķirtā atmiņa, kas izveidota, izmantojot vienu calloc()vai otru malloc(), netiek atbrīvota atsevišķi. Jums ir skaidri jāizmanto, free()lai atbrīvotu vietu.

Bezmaksas sintakse ()

 free(ptr);

Šis paziņojums atbrīvo vietu, kas piešķirta atmiņā, uz kuru norāda ptr.

1. piemērs: malloc () un free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; ) 

Šeit mēs esam dinamiski piešķīruši atmiņu n skaitam int.

2. piemērs: calloc () un free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; ) 

C realloc ()

Ja dinamiski piešķirtā atmiņa ir nepietiekama vai ir lielāka par nepieciešamo, izmantojot realloc()funkciju , varat mainīt iepriekš piešķirtās atmiņas lielumu .

Realloc sintakse ()

 ptr = realloc(ptr, x);

Šeit ptr tiek pārdalīts ar jaunu izmēru x.

3. piemērs: realloc ()

 #include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )

Palaidot programmu, izeja būs:

 Ievadiet izmēru: 2 Iepriekš piešķirtās atmiņas adreses: 26855472 26855476 Ievadiet jauno izmēru: 4 Tikko piešķirtās atmiņas adreses: 26855472 26855476 26855480 26855484

Interesanti raksti...