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.

  1. Introducció a 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

void* calloc(size_t num_elements, size_t element_size);
  • 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ó

  1. calloc(n, sizeof(int)) assigna memòria per a 5 enters i inicialitza tots els elements a zero.
  2. Es comprova si l'assignació de memòria ha estat exitosa.
  3. Es mostren els valors inicialitzats a zero.
  4. Finalment, es fa servir free per alliberar la memòria assignada.

  1. Introducció a 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

void* realloc(void* ptr, size_t new_size);
  • 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ó

  1. malloc(n * sizeof(int)) assigna memòria per a 5 enters.
  2. Es comprova si l'assignació de memòria ha estat exitosa.
  3. Es inicialitzen els elements del bloc de memòria.
  4. realloc(arr, n * sizeof(int)) augmenta la mida del bloc de memòria a 10 enters.
  5. Es comprova si la reassignació de memòria ha estat exitosa.
  6. Es inicialitzen els nous elements del bloc de memòria.
  7. Es mostren tots els elements del bloc de memòria.
  8. Finalment, es fa servir free per alliberar la memòria assignada.

  1. Comparació entre 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

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

  1. 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

Mòdul 2: Tipus de Dades i Variables

Mòdul 3: Flux de Control

Mòdul 4: Funcions

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

Mòdul 10: Temes Avançats

Mòdul 11: Millors Pràctiques i Optimització

Mòdul 12: Projecte i Avaluació Final

© Copyright 2024. Tots els drets reservats