Menu
Coddy logo textTech

Utiliser sizeof() pour l'allocation

Fait partie de la section Logique & Flux du Journey C de Coddy. Leçon 33 sur 63.

Bien que malloc() vous permette d’allouer de la mémoire dynamiquement, il existe une bonne pratique importante qui rend votre code plus portable et plus facile à maintenir : utiliser l’opérateur sizeof() pour déterminer le nombre d’octets à allouer.

L'opérateur sizeof() retourne le nombre d'octets requis pour stocker un type de données particulier sur votre système. Au lieu de coder en dur les tailles en octets, vous pouvez laisser sizeof() calculer automatiquement la quantité correcte :

// Au lieu de deviner la taille des octets :
int *ptr = (int*)malloc(4);  // Suppose que int fait 4 octets

// Utilisez sizeof() pour la portabilité :
int *ptr = (int*)malloc(sizeof(int));  // Toujours correct

Cette approche devient particulièrement précieuse lors de l'allocation de tableaux. Pour allouer de l'espace pour plusieurs éléments, multipliez le nombre d'éléments par la taille de chaque élément :

// Allouer de l'espace pour 10 entiers
int *arr = (int*)malloc(10 * sizeof(int));

// Allouer de l'espace pour 5 doubles
double *values = (double*)malloc(5 * sizeof(double));

L'utilisation de sizeof() permet à votre code de fonctionner correctement sur différents systèmes où les types de données peuvent avoir des tailles différentes, et cela communique clairement votre intention d'allouer de l'espace pour un nombre spécifique d'éléments d'un type particulier.

challenge icon

Défi

Facile

Écrivez un programme en C qui démontre l’utilisation correcte de sizeof() avec malloc() pour l’allocation dynamique de mémoire. Votre programme doit :

  1. Lire un entier n saisi par l’utilisateur, représentant le nombre d’éléments à allouer
  2. Utiliser malloc() avec sizeof() pour allouer dynamiquement de la mémoire pour un tableau de n valeurs de type double
  3. Convertir le pointeur void renvoyé en pointeur vers un double
  4. Lire n valeurs de type double saisies par l’utilisateur et les stocker dans le tableau alloué
  5. Calculer la mémoire totale allouée en octets et l’afficher au format suivant : Memory allocated: [bytes] bytes
  6. Calculer et afficher la moyenne de toutes les valeurs avec exactement 2 décimales au format suivant : Average: [value]
  7. Trouver et afficher la plus grande valeur avec exactement 2 décimales au format suivant : Largest: [value]

N’oubliez pas d’inclure l’en-tête <stdlib.h> pour utiliser malloc(). Votre programme doit démontrer comment sizeof() garantit une allocation correcte de la mémoire, quelle que soit la taille des types de données du système.

Par exemple, si l’entrée est :

3
2.5 7.8 4.1

Votre sortie doit être :

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

Ce défi renforce l’importance d’utiliser sizeof() afin de rendre votre allocation dynamique de mémoire portable et facile à maintenir, en calculant automatiquement le nombre correct d’octets nécessaires pour n’importe quel type de données sur n’importe quel système.

Essayez vous-même

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

int main() {
    // Lire le nombre d'éléments
    int n;
    scanf("%d", &n);
    
    // TODO: Écrivez votre code ci-dessous
    // 1. Allouer de la mémoire pour n valeurs de type double en utilisant malloc() et sizeof()
    // 2. Convertir le pointeur retourné en double*
    // 3. Lire n valeurs de type double et les stocker dans le tableau alloué
    // 4. Calculer et afficher la mémoire allouée en octets
    // 5. Calculer et afficher la moyenne avec 2 décimales
    // 6. Trouver et afficher la plus grande valeur avec 2 décimales
    
    return 0;
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique & Flux

Entraînez-vous par vous-même : Compilateur C en ligne