Taille d'une variable en C
Fermé
Mathilde
-
12 mai 2004 à 13:26
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 31 août 2012 à 22:42
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 31 août 2012 à 22:42
A voir également:
- Taille variable
- Comment réduire la taille d'un fichier - Guide
- Reduire taille photo - Guide
- Afficher taille dossier windows - Guide
- Taille iphone 14 - Guide
7 réponses
blurk
Messages postés
486
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
15 mars 2009
160
12 mai 2004 à 14:10
12 mai 2004 à 14:10
hello!
sizeof (toto) renvoie la taille du pointeur sur char
(4 octets, soit 32 bits, soit 2^32 octets d'adressage)
sizeof(*toto) renvoie la taille d'un caractere (1 octet)
car sizeof ne compte pas les caracteres jusqu'au zéro terminal
et que la taille d'un type de variable n'est pas un nombre d'éléments. char * est un type, pas un espace mémoire.
strlen (toto) renvoie la taille de la chaine de caracteres (pas 20, car il ignore la taille allouée et compte les caractères jusqu'au 0).
Le C est un language système, son compilateur ne rajoute pas de
code pour contôler les espaces mémoire alloués, ce qui empêcherait d'avoir un contrôle total de ce qui est compilé, ralentirait le code et augmenterait sa taille (c'est anti C).
il n'y a rien qui retournera 20
voilà le seul moyen de récupérer la taille allouée :
int i=20;
char *toto;
if ( (toto =(char *) malloc(i))==null) i=0;
//cordialement
sizeof (toto) renvoie la taille du pointeur sur char
(4 octets, soit 32 bits, soit 2^32 octets d'adressage)
sizeof(*toto) renvoie la taille d'un caractere (1 octet)
car sizeof ne compte pas les caracteres jusqu'au zéro terminal
et que la taille d'un type de variable n'est pas un nombre d'éléments. char * est un type, pas un espace mémoire.
strlen (toto) renvoie la taille de la chaine de caracteres (pas 20, car il ignore la taille allouée et compte les caractères jusqu'au 0).
Le C est un language système, son compilateur ne rajoute pas de
code pour contôler les espaces mémoire alloués, ce qui empêcherait d'avoir un contrôle total de ce qui est compilé, ralentirait le code et augmenterait sa taille (c'est anti C).
il n'y a rien qui retournera 20
voilà le seul moyen de récupérer la taille allouée :
int i=20;
char *toto;
if ( (toto =(char *) malloc(i))==null) i=0;
//cordialement
Fada09
Messages postés
1701
Date d'inscription
lundi 15 septembre 2003
Statut
Contributeur
Dernière intervention
4 septembre 2010
543
12 mai 2004 à 13:31
12 mai 2004 à 13:31
Salut,
Bon je me rappelle plus sous Linux comment sont représentées les données mais 4 semble le bon chiffre.
En effet tu veut récuperer la taille d'un pointeur (c'est à dire une adresse = un entier).
Donc que tu fasses un pointeur sur un entier, un tableau de caractère, ou même une structure plus complexe ton pointeur sera toujours un entier (donc 4octets).
Voila j'espere que je t'ai aidé
A bientot.
;-)
~ ~ Fada ~ ~ : Member of Star!alco
Bon je me rappelle plus sous Linux comment sont représentées les données mais 4 semble le bon chiffre.
En effet tu veut récuperer la taille d'un pointeur (c'est à dire une adresse = un entier).
Donc que tu fasses un pointeur sur un entier, un tableau de caractère, ou même une structure plus complexe ton pointeur sera toujours un entier (donc 4octets).
Voila j'espere que je t'ai aidé
A bientot.
;-)
~ ~ Fada ~ ~ : Member of Star!alco
JSS
Messages postés
3745
Date d'inscription
jeudi 22 avril 2004
Statut
Contributeur
Dernière intervention
17 décembre 2004
32
12 mai 2004 à 13:51
12 mai 2004 à 13:51
Bonjour ou Bonsoir,
Si tu veux recuperer la taille de ton mot et non pas la taille d'un pointeur strlen doit marcher.
D'apres mes souvenirs quelques precautions :
1 trouver dans quel include est mis la fonction. je ne sais plus si c'est de base mais il me semble que #include <string.h> ou #include <ctype.h> devrait etre bon.
2 il me semble qu'il y a juste une difference de plus ou moins 1 dans la taille d'un mot (je sais plus si il compte le '\0' ou non).
Good luck.
JSS
Si tu veux recuperer la taille de ton mot et non pas la taille d'un pointeur strlen doit marcher.
D'apres mes souvenirs quelques precautions :
1 trouver dans quel include est mis la fonction. je ne sais plus si c'est de base mais il me semble que #include <string.h> ou #include <ctype.h> devrait etre bon.
2 il me semble qu'il y a juste une difference de plus ou moins 1 dans la taille d'un mot (je sais plus si il compte le '\0' ou non).
Good luck.
JSS
Yop,
ben en fait quand tu fais un malloc essaye plutot :
char *toto;
toto = (char *)malloc(sizeof(char));
Au moins tu devrais avoir la taille d'un caractère.
++
Nico
ben en fait quand tu fais un malloc essaye plutot :
char *toto;
toto = (char *)malloc(sizeof(char));
Au moins tu devrais avoir la taille d'un caractère.
++
Nico
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
non, car ce code n'est alors plus réutilisable (quelle que soit la taille de char ou quel que soit le type qui remplace char).
Principe de base de la programmation, la ré-utilisabilité du code.
d'autre part, si le malloc retourne null, alors l'allocation n'est pas possible
et ne sera donc pas effectuée, d'où l'expression
if ( (toto =(char *) malloc(i))==null) i=0; qui permet de remplacer un segmentation fault par une sortie de programme (ou de fonction).
Principe de base de la programmation, la ré-utilisabilité du code.
d'autre part, si le malloc retourne null, alors l'allocation n'est pas possible
et ne sera donc pas effectuée, d'où l'expression
if ( (toto =(char *) malloc(i))==null) i=0; qui permet de remplacer un segmentation fault par une sortie de programme (ou de fonction).
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
31 août 2012 à 12:17
31 août 2012 à 12:17
quelle que soit la taille de char
La taille de char est fixe et vaut 1 byte.
quel que soit le type qui remplace char
Moui, mais dans ce cas, à la place de mettre sizeof(char), utilise plutôt sizeof *toto. Ainsi si tu changes le type de la variable toto, le code restera correct.
if ( (toto =(char *) malloc(i))==null) i=0;
Ce n'est pas null mais NULL. Et pour info, le cast est superflu.
La taille de char est fixe et vaut 1 byte.
quel que soit le type qui remplace char
Moui, mais dans ce cas, à la place de mettre sizeof(char), utilise plutôt sizeof *toto. Ainsi si tu changes le type de la variable toto, le code restera correct.
if ( (toto =(char *) malloc(i))==null) i=0;
Ce n'est pas null mais NULL. Et pour info, le cast est superflu.
-> Ce n'est pas null mais NULL. Et pour info, le cast est superflu.
NULL est une macro de type #define NULL ((void*)0)
La fonction malloc retourne un type void, et toto est de type char, d'où génération d'un avertissement à la compilation.
et même si ce n'était pas le cas, on mettrait quand même le casting pour la lisibilité du code.
NULL est une macro de type #define NULL ((void*)0)
La fonction malloc retourne un type void, et toto est de type char, d'où génération d'un avertissement à la compilation.
et même si ce n'était pas le cas, on mettrait quand même le casting pour la lisibilité du code.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
Modifié par fiddy le 31/08/2012 à 14:57
Modifié par fiddy le 31/08/2012 à 14:57
NULL est une valeur standard. Alors que null n'existe pas.
Après libre à toi, si tu as envie de redéfinir des types déjà existants. Genre NuLl ou null.
La fonction malloc retourne un type void
Non ce n'est pas void, mais void*. Ca change tout. J'y reviens au paragraphe suivant.
Pareil, toto est de type char* (et non char).
d'où génération d'un avertissement à la compilation.
Non. Aucun compilateur ne mettra d'avertissement. La promotion du type générique (void*) en un type concret (comme char*) est implicite.D'ailleurs, c'est là tout l'intérêt de ce type.
on mettrait quand même le casting pour la lisibilité du code.
Cela surcharge plus le code qu'autre chose et n'apporte aucune lisibilité supplémentaire.
Autant cette surcharge était nécessaire en K&R (pour des raisons historiques), mais elle ne l'est plus du tout. D'ailleurs c'est déconseillé, car ce cast empêchera certains compilateurs de détecter si l'entête <stdlib.h> a été inclu ou non.
Après libre à toi, si tu as envie de redéfinir des types déjà existants. Genre NuLl ou null.
La fonction malloc retourne un type void
Non ce n'est pas void, mais void*. Ca change tout. J'y reviens au paragraphe suivant.
Pareil, toto est de type char* (et non char).
d'où génération d'un avertissement à la compilation.
Non. Aucun compilateur ne mettra d'avertissement. La promotion du type générique (void*) en un type concret (comme char*) est implicite.D'ailleurs, c'est là tout l'intérêt de ce type.
on mettrait quand même le casting pour la lisibilité du code.
Cela surcharge plus le code qu'autre chose et n'apporte aucune lisibilité supplémentaire.
Autant cette surcharge était nécessaire en K&R (pour des raisons historiques), mais elle ne l'est plus du tout. D'ailleurs c'est déconseillé, car ce cast empêchera certains compilateurs de détecter si l'entête <stdlib.h> a été inclu ou non.
void est un type abstrait par définition (même void*)
La surcharge, c'est une propriété permettant le polymorphisme dans les langages objet (c'est à dire qu'on puisse passer plusieurs types de variables à une fonction pour un même paramètre) , et le C n'en est pas un.
(est ce que l'objet a simplifié la compréhension d'un programme ?
pas sûr, mais c'est un autre débat)
La lisibilité est: de quel type parle-t-on ?
- Dans certains encodages et dans certains systèmes d'exploitations, il existe des types char qui peuvent tenir sur 2 octets (utf8 utf16, utf32)
La surcharge, c'est une propriété permettant le polymorphisme dans les langages objet (c'est à dire qu'on puisse passer plusieurs types de variables à une fonction pour un même paramètre) , et le C n'en est pas un.
(est ce que l'objet a simplifié la compréhension d'un programme ?
pas sûr, mais c'est un autre débat)
La lisibilité est: de quel type parle-t-on ?
- Dans certains encodages et dans certains systèmes d'exploitations, il existe des types char qui peuvent tenir sur 2 octets (utf8 utf16, utf32)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
Modifié par fiddy le 31/08/2012 à 22:51
Modifié par fiddy le 31/08/2012 à 22:51
void est un type abstrait par définition (même void*)
Certes, mais ils ne sont pas synonymes. malloc renvoie un void* et non un void...
La surcharge, c'est une propriété permettant le polymorphisme dans
Avant d'être un mot "informatique", le mot "surcharge" est un mot français. Quand je parle de surcharge, cela signifie que cela rend le code plus lourd, moins lisible.
La lisibilité est: de quel type parle-t-on ?
Bon ok, affaire de goût. Si tu préfères mettre un cast inutile, car tu trouves ça plus clair, beh continue.
Dans certains encodages et dans certains systèmes d'exploitations, il existe des types char qui peuvent tenir sur 2 octets (utf8 utf16, utf32)
Encore ne faut-il pas confondre byte et octet. Quel que soit l'implémentation, un char vaut 1 byte (sizeof (char) = 1) d'au moins 8 bits. Libre à toi de faire tenir le byte sur 2 octets. Mais cela ne changera pas la valeur de sizeof(char).
Certes, mais ils ne sont pas synonymes. malloc renvoie un void* et non un void...
La surcharge, c'est une propriété permettant le polymorphisme dans
Avant d'être un mot "informatique", le mot "surcharge" est un mot français. Quand je parle de surcharge, cela signifie que cela rend le code plus lourd, moins lisible.
La lisibilité est: de quel type parle-t-on ?
Bon ok, affaire de goût. Si tu préfères mettre un cast inutile, car tu trouves ça plus clair, beh continue.
Dans certains encodages et dans certains systèmes d'exploitations, il existe des types char qui peuvent tenir sur 2 octets (utf8 utf16, utf32)
Encore ne faut-il pas confondre byte et octet. Quel que soit l'implémentation, un char vaut 1 byte (sizeof (char) = 1) d'au moins 8 bits. Libre à toi de faire tenir le byte sur 2 octets. Mais cela ne changera pas la valeur de sizeof(char).