C Dinamikus memóriaallokáció malloc (), calloc (), free () & realloc () használatával

Ebben az oktatóanyagban megtanulja dinamikusan lefoglalni a memóriát a C programban a szokásos könyvtárfunkciók használatával: malloc (), calloc (), free () és realloc ().

Mint tudják, egy tömb rögzített számú érték gyűjteménye. Ha egy tömb méretét deklarálta, akkor nem módosíthatja.

Előfordul, hogy a deklarált tömb mérete elégtelen lehet. A probléma megoldásához manuálisan rendelhet memóriát futás közben. Ezt a C programozásban dinamikus memóriafoglalásnak nevezik.

Memóriát dinamikusan könyvtári funkciók malloc(), calloc(), realloc()és free()használnak. Ezeket a függvényeket a fejlécfájl határozza meg .

C malloc ()

A "malloc" név a memóriafoglalást jelenti.

A malloc()függvény fenntart egy blokkot a megadott számú bájt memóriájához. És visszaad egy mutatót, voidamelynek bármilyen formájú mutatóba dobható.

A malloc szintaxisa ()

 ptr = (castType*) malloc(size);

Példa

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

A fenti utasítás 400 bájt memóriát oszt ki. Azért, mert a mérete float4 bájt. És a ptr mutató az első bájt címét tárolja a lefoglalt memóriában.

A kifejezés NULLmutatót eredményez, ha a memóriát nem lehet lefoglalni.

C calloc ()

A "calloc" név egybefüggő allokációt jelent.

A malloc()funkció lefoglalja a memóriát, és inicializálatlanul hagyja a memóriát. Míg a calloc()függvény lefoglalja a memóriát és inicializálja az összes bitet nullára.

A calloc () szintaxisa

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

Példa:

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

A fenti utasítás 25 memóriaelemhez rendel egybefüggő helyet a memóriában float.

C mentes ()

Dinamikusan lefoglalt memória, amely bármelyikükkel létrehozott, calloc()vagy malloc()nem szabadul fel önmagukban. A free()hely felszabadításához kifejezetten használnia kell.

A szabad szintaxisa ()

 free(ptr);

Ez a kijelentés felszabadítja a memória által kijelölt helyet ptr.

1. példa: malloc () és 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; ) 

Itt dinamikusan lefoglaltuk a memóriát n számra int.

2. példa: calloc () és 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 ()

Ha a dinamikusan lefoglalt memória nem elegendő vagy meghaladja a szükséges mértéket, a realloc()funkció segítségével megváltoztathatja a korábban lefoglalt memória méretét .

A realloc () szintaxisa

 ptr = realloc(ptr, x);

Itt a ptr átcsoportosítva egy új x méretre.

3. példa: 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; )

A program futtatásakor a kimenet a következő lesz:

 Adja meg a méretet: 2 A korábban lefoglalt memória címei: 26855472 26855476 Írja be az új méretet: 4 Az újonnan lefoglalt memória címei: 26855472 26855476 26855480 26855484

érdekes cikkek...