En aquest tema, explorarem dues funcions essencials per a la gestió dinàmica de memòria en C: calloc
i realloc
. Aquestes funcions ens permeten gestionar la memòria de manera més eficient i flexible, adaptant-se a les necessitats canviants del nostre programa.
- Introducció a
calloc
calloc
Què és calloc
?
calloc
(clear allocation) és una funció que s'utilitza per assignar memòria dinàmica per a un nombre específic d'elements d'una mida determinada. A diferència de malloc
, calloc
inicialitza la memòria assignada a zero.
Sintaxi
num_elements
: Nombre d'elements a assignar.element_size
: Mida de cada element en bytes.
Exemple Pràctic
#include <stdio.h> #include <stdlib.h> int main() { int *arr; int n = 5; // Assignació de memòria per a 5 enters arr = (int*) calloc(n, sizeof(int)); if (arr == NULL) { printf("Error en l'assignació de memòria\n"); return 1; } // Mostra els valors inicialitzats a zero for (int i = 0; i < n; i++) { printf("arr[%d] = %d\n", i, arr[i]); } // Alliberar la memòria free(arr); return 0; }
Explicació
calloc(n, sizeof(int))
assigna memòria per a 5 enters i inicialitza tots els elements a zero.- Es comprova si l'assignació de memòria ha estat exitosa.
- Es mostren els valors inicialitzats a zero.
- Finalment, es fa servir
free
per alliberar la memòria assignada.
- Introducció a
realloc
realloc
Què és realloc
?
realloc
(reallocation) és una funció que s'utilitza per canviar la mida d'un bloc de memòria prèviament assignat. Aquesta funció és útil quan necessitem augmentar o reduir la mida d'un bloc de memòria existent.
Sintaxi
ptr
: Punter al bloc de memòria prèviament assignat.new_size
: Nova mida del bloc de memòria en bytes.
Exemple Pràctic
#include <stdio.h> #include <stdlib.h> int main() { int *arr; int n = 5; // Assignació de memòria per a 5 enters arr = (int*) malloc(n * sizeof(int)); if (arr == NULL) { printf("Error en l'assignació de memòria\n"); return 1; } // Inicialitzar els elements for (int i = 0; i < n; i++) { arr[i] = i + 1; } // Augmentar la mida del bloc de memòria a 10 enters n = 10; arr = (int*) realloc(arr, n * sizeof(int)); if (arr == NULL) { printf("Error en la reassignació de memòria\n"); return 1; } // Inicialitzar els nous elements for (int i = 5; i < n; i++) { arr[i] = i + 1; } // Mostrar tots els elements for (int i = 0; i < n; i++) { printf("arr[%d] = %d\n", i, arr[i]); } // Alliberar la memòria free(arr); return 0; }
Explicació
malloc(n * sizeof(int))
assigna memòria per a 5 enters.- Es comprova si l'assignació de memòria ha estat exitosa.
- Es inicialitzen els elements del bloc de memòria.
realloc(arr, n * sizeof(int))
augmenta la mida del bloc de memòria a 10 enters.- Es comprova si la reassignació de memòria ha estat exitosa.
- Es inicialitzen els nous elements del bloc de memòria.
- Es mostren tots els elements del bloc de memòria.
- Finalment, es fa servir
free
per alliberar la memòria assignada.
- Comparació entre
malloc
, calloc
i realloc
malloc
, calloc
i realloc
Funció | Inicialització | Ús Principal |
---|---|---|
malloc |
No | Assignació de memòria |
calloc |
Sí (a zero) | Assignació de memòria inicialitzada |
realloc |
No | Reassignació de memòria |
- Exercicis Pràctics
Exercici 1
Escriu un programa que utilitzi calloc
per assignar memòria per a un array de 10 enters, inicialitzi els elements a zero i mostri els valors.
Solució
#include <stdio.h> #include <stdlib.h> int main() { int *arr; int n = 10; arr = (int*) calloc(n, sizeof(int)); if (arr == NULL) { printf("Error en l'assignació de memòria\n"); return 1; } for (int i = 0; i < n; i++) { printf("arr[%d] = %d\n", i, arr[i]); } free(arr); return 0; }
Exercici 2
Escriu un programa que utilitzi realloc
per augmentar la mida d'un array de 5 a 15 enters, inicialitzi els nous elements i mostri tots els valors.
Solució
#include <stdio.h> #include <stdlib.h> int main() { int *arr; int n = 5; arr = (int*) malloc(n * sizeof(int)); if (arr == NULL) { printf("Error en l'assignació de memòria\n"); return 1; } for (int i = 0; i < n; i++) { arr[i] = i + 1; } n = 15; arr = (int*) realloc(arr, n * sizeof(int)); if (arr == NULL) { printf("Error en la reassignació de memòria\n"); return 1; } for (int i = 5; i < n; i++) { arr[i] = i + 1; } for (int i = 0; i < n; i++) { printf("arr[%d] = %d\n", i, arr[i]); } free(arr); return 0; }
- Conclusió
En aquest tema, hem après com utilitzar calloc
i realloc
per gestionar la memòria dinàmica en C. Hem vist com calloc
inicialitza la memòria a zero i com realloc
ens permet canviar la mida d'un bloc de memòria existent. Aquests conceptes són fonamentals per escriure programes eficients i flexibles en C.
Curs de Programació en C
Mòdul 1: Introducció al C
- Introducció a la Programació
- Configuració de l'Entorn de Desenvolupament
- Programa Hello World
- Sintaxi i Estructura Bàsiques
Mòdul 2: Tipus de Dades i Variables
Mòdul 3: Flux de Control
Mòdul 4: Funcions
- Introducció a les Funcions
- Arguments de Funció i Valors de Retorn
- Àmbit i Durada de les Variables
- Funcions Recursives
Mòdul 5: Arrays i Strings
Mòdul 6: Punteres
Mòdul 7: Estructures i Unions
Mòdul 8: Assignació Dinàmica de Memòria
Mòdul 9: Gestió d'Arxius
- Introducció a la Gestió d'Arxius
- Lectura i Escriptura d'Arxius
- Posicionament d'Arxius
- Gestió d'Errors en Operacions d'Arxius
Mòdul 10: Temes Avançats
- Directives del Preprocessador
- Arguments de Línia de Comandes
- Llistes d'Arguments Variables
- Multifil en C
Mòdul 11: Millors Pràctiques i Optimització
- Llegibilitat del Codi i Documentació
- Tècniques de Depuració
- Optimització del Rendiment
- Consideracions de Seguretat