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
callocQuè é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
freeper alliberar la memòria assignada.
- Introducció a
realloc
reallocQuè é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
freeper 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
