C Dynamisk hukommelsesallokering ved hjælp af malloc (), calloc (), gratis () & realloc ()

I denne vejledning lærer du dynamisk at allokere hukommelse i dit C-program ved hjælp af standardbiblioteksfunktioner: malloc (), calloc (), gratis () og realloc ().

Som du ved, er en matrix en samling af et fast antal værdier. Når størrelsen på en matrix er erklæret, kan du ikke ændre den.

Nogle gange kan størrelsen på det array, du har deklareret, være utilstrækkelig. For at løse dette problem kan du allokere hukommelse manuelt under kørselstiden. Dette er kendt som dynamisk hukommelsesallokering i C-programmering.

At allokere hukommelse dynamisk, biblioteksfunktioner er malloc(), calloc(), realloc()og free()anvendes. Disse funktioner er defineret i headerfilen.

C malloc ()

Navnet "malloc" står for hukommelsestildeling.

Den malloc()funktion forbeholder en blok af hukommelse af det angivne antal bytes. Og det returnerer en markør, voidsom kan kastes i markører af enhver form.

Syntaks for malloc ()

 ptr = (castType*) malloc(size);

Eksempel

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

Ovenstående erklæring tildeler 400 byte hukommelse. Det skyldes, at størrelsen på floater 4 byte. Og markøren ptr holder adressen på den første byte i den tildelte hukommelse.

Udtrykket resulterer i en NULLmarkør, hvis hukommelsen ikke kan allokeres.

C calloc ()

Navnet "calloc" står for sammenhængende tildeling.

Den malloc()funktion allokerer hukommelse og blade hukommelsen initialiseret. Mens calloc()funktionen tildeler hukommelse og initialiserer alle bits til nul.

Syntaks for calloc ()

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

Eksempel:

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

Ovenstående sætning tildeler sammenhængende plads i hukommelsen til 25 elementelementer float.

C fri ()

Dynamisk allokeret hukommelse oprettet med enten calloc()eller malloc()ikke frigøres alene. Du skal udtrykkeligt bruge free()til at frigøre rummet.

Syntaks for gratis ()

 free(ptr);

Denne erklæring frigør den plads, der er tildelt i hukommelsen, som er påpeget af ptr.

Eksempel 1: malloc () og gratis ()

 // 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; ) 

Her har vi dynamisk tildelt hukommelsen til et antal int.

Eksempel 2: calloc () og gratis ()

 // 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 ()

Hvis den dynamisk tildelte hukommelse er utilstrækkelig eller mere end krævet, kan du ændre størrelsen på tidligere tildelt hukommelse ved hjælp af realloc()funktionen.

Syntaks for realloc ()

 ptr = realloc(ptr, x);

Her omfordeles ptr med en ny størrelse x.

Eksempel 3: 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; )

Når du kører programmet, vil output være:

 Indtast størrelse: 2 Adresser til tidligere tildelt hukommelse: 26855472 26855476 Indtast den nye størrelse: 4 Adresser til nyligt allokeret hukommelse: 26855472 26855476 26855480 26855484

Interessante artikler...