pourquoi utilisons-nous sizeof en utilisant malloc ?[fermé]
-
23-12-2019 - |
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.
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 char
s, 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 int
s.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.