Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> C Taal

C Dynamische geheugentoewijzing

C Dynamische geheugentoewijzing

In deze zelfstudie leert u om dynamisch geheugen in uw C-programma toe te wijzen met behulp van standaard bibliotheekfuncties:malloc(), calloc(), free() en realloc().

Zoals je weet, is een array een verzameling van een vast aantal waarden. Zodra de grootte van een array is gedeclareerd, kunt u deze niet meer wijzigen.

Soms is de grootte van de array die u hebt aangegeven onvoldoende. Om dit probleem op te lossen, kunt u tijdens runtime handmatig geheugen toewijzen. Dit staat bekend als dynamische geheugentoewijzing in C-programmering.

Om geheugen dynamisch toe te wijzen, zijn de bibliotheekfuncties malloc() , calloc() , realloc() en free() worden gebruikt. Deze functies zijn gedefinieerd in de <stdlib.h> header-bestand.


C malloc()

De naam "malloc" staat voor geheugentoewijzing.

De malloc() functie reserveert een blok geheugen van het opgegeven aantal bytes. En het retourneert een pointer van void die kan worden gegoten in pointers van elke vorm.


Syntaxis van malloc()

ptr = (castType*) malloc(size);

Voorbeeld

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

De bovenstaande verklaring wijst 400 bytes geheugen toe. Het is omdat de grootte van float is 4 bytes. En de aanwijzer ptr bevat het adres van de eerste byte in het toegewezen geheugen.

De uitdrukking resulteert in een NULL aanwijzer als het geheugen niet kan worden toegewezen.


C calloc()

De naam "calloc" staat voor aaneengesloten toewijzing.

De malloc() functie wijst geheugen toe en laat het geheugen niet geïnitialiseerd, terwijl de calloc() functie wijst geheugen toe en initialiseert alle bits op nul.


Syntaxis van calloc()

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

Voorbeeld:

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

De bovenstaande verklaring wijst aaneengesloten ruimte in het geheugen toe voor 25 elementen van het type float .


C gratis()

Dynamisch toegewezen geheugen gemaakt met ofwel calloc() of malloc() komt niet vanzelf vrij. Je moet expliciet free() . gebruiken om de spatie vrij te maken.


Syntaxis van free()

free(ptr);

Deze verklaring maakt de ruimte vrij die is toegewezen in het geheugen dat wordt aangeduid door ptr .


Voorbeeld 1:malloc() en free()

// Program to calculate the sum of n numbers entered by the user

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

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;
}

Uitvoer

Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156

Hier hebben we het geheugen dynamisch toegewezen voor n aantal int .


Voorbeeld 2:calloc() en free()

// Program to calculate the sum of n numbers entered by the user

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

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;
}

Uitvoer

Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156

C realloc()

Als het dynamisch toegewezen geheugen onvoldoende of meer is dan vereist, kunt u de grootte van eerder toegewezen geheugen wijzigen met behulp van de realloc() functie.


Syntaxis van realloc()

ptr = realloc(ptr, x);

Hier, ptr wordt opnieuw toegewezen met een nieuwe maat x .


Voorbeeld 3:realloc()

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

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:\n");
  for(i = 0; i < n1; ++i)
    printf("%pc\n",ptr + i);

  printf("\nEnter the new size: ");
  scanf("%d", &n2);

  // rellocating the memory
  ptr = realloc(ptr, n2 * sizeof(int));

  printf("Addresses of newly allocated memory:\n");
  for(i = 0; i < n2; ++i)
    printf("%pc\n", ptr + i);
  
  free(ptr);

  return 0;
}

Uitvoer

Enter size: 2
Addresses of previously allocated memory:
26855472
26855476

Enter the new size: 4
Addresses of newly allocated memory:
26855472
26855476
26855480
26855484

C Taal

  1. Alleen-lezen geheugen (ROM)
  2. Microprocessors
  3. C++ Geheugenbeheer:nieuw en verwijderen
  4. Cervoz upgradet DDR4-2666-geheugen van de volgende generatie
  5. C++ Dynamische toewijzing van arrays met voorbeeld
  6. calloc() Functie in C-bibliotheek met programma VOORBEELD
  7. realloc() Functie in C Library:Hoe te gebruiken? Syntaxis en voorbeeld
  8. C - Geheugenbeheer
  9. Dynamische prijzen in traditionele winkels zijn onvermijdelijk
  10. C++ dynamisch geheugen
  11. Java 10 - Heaptoewijzing