Question

Quel est le but de l'utilisation sizeof en utilisant malloc dans C?Pourquoi c'est nécessaire ?

Je veux dire, nous pouvons utiliser sizeof mais nous connaissons déjà la taille (= 1000 octets) de ce que nous allouons en mémoire ?

Je suis débutant en C donc.Cela pourrait être une question très évidente.

Était-ce utile?

La solution

Types de données et mémoire

La réponse est dans les types de données.Pendant que tu sais combien d'objets pour lesquels vous souhaitez allouer de la mémoire, vous ne voudrez peut-être pas vous donner la peine de calculer mentalement leur taille.

La maintenabilité aussi

Et si la composition de ces éléments changeait plus tard ?Ensuite, vous êtes foutu et devez tout éditer.

Ce n'est donc pas pertinent dans votre exemple, sans contexte.Mais dans le cas où vous souhaitez allouer de la mémoire pour des choses plus complexes (par exemple, une structure avec un certain nombre de champs), cela devient très important et utile.

Exemple 1 (pas si important ici) :

char *s = malloc(100 * sizeof(char));

Mais bon, c'est juste chars, c'est bon, tu aurais pu faire ça :

char *s = malloc(100);

Fonctionne généralement.Mais se tirer une balle dans le pied, comme vous le verrez ci-dessous.

Exemple 2 (compte déjà un peu):

int *i = malloc(100 * sizeof(int));

Bien sûr, vous auriez pu écrire ça :

int *i = malloc(100 * 4);

Autrement dit, en supposant que vous développiez pour une seule architecture que vous connaissez assez bien.

Exemple 3 (commence à avoir pas mal d'importance !) :

typedef struct s_listelement{
    int                  dataitem;
    struct s_listelement *link;
}              t_listelement;

t_listement *le = malloc(sizeof(t_listelement));

Imaginez maintenant que la structure de l'élément de liste chaînée contient un tas d'autres champs...

Voudrais-tu faire confiance sizeof(), ou aller t'amuser et faire le calcul toi-même ?

Autres conseils

Supposons que vous souhaitiez allouer de la mémoire pour stocker ints.Votre première hypothèse sera, ok, j'ai besoin d'avoir n entiers et chaque entier nécessite x octets.L'espace sera donc n*x octets.

Mais en fait ça x cela dépend de l'architecture.C'est peut-être 16 bits, 32 bits, etc.Donc, pour que votre code puisse fonctionner dans différents environnements, il est recommandé d'utiliser n*sizeof(int) au lieu de n*x.

Par exemple, si vous devez allouer de l'espace pour 10 entiers :

int *p=malloc(sizeof(int)*10);

Que se passe-t-il si vous modifiez la taille de mallocated?

Vous devrez 1) calculer à nouveau la nouvelle taille (en laissant de côté les problèmes d'architectures cibles multiples, où vous devrez calculer la nouvelle taille dans chaque cible), 2) rechercher tout malloc(1000), assurez-vous qu'il fait référence à mallocated (ce qui n'est peut-être pas évident) et remplacez-le par une nouvelle taille.

Vous n'avez aucun de ces 2 problèmes en utilisant sizeof.Utilisant ainsi sizeof conduit à un code plus maintenable et plus lisible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top