Un doute concernant sizeof()

Bonjour à tous,

Je m'excuse pour ma question de débutant, mais j'ai un doute concernant sizeof()

Si je fais ca

char messageToSend[141];

char messageToReceive[sizeof(messageToSend)]
char message[strlen(messageToSend)]

On est d'accord que messageToReceive va avoir la meme taille que messageToSend, soit 141?
et que message lui aurra la taille correspondant au nombre de caractere contenu dans messageToSend?

Je doute concernant sizeof(), s'il ne va pas me retourner une autre valeur?

merci pour vos lumières

Sizeof retourne la taille du type passé en paramètre en bytes.

Quand on crée un tableau, on attend le nombre d'éléments attendu (141 = 141 chars, or un char fait 4 bytes, donc sizeof te retourne 141*4). Ici ça fonctionne car tu alloue plus des 141 caractères utilisés. Mais du coup tu gâche de la mémoire.

Accessoirement, la tu as un bug qui t'attends au tournant: Si jamais ton messageToSend est un jour alloué dynamiquement, le type sera char* et donc la sizeof te retournera 8 (taille d'un pointeur).

Globalement en C, on ne peux pas (et ne doit pas) pouvoir compter la taille d'un tableau. Mon conseil c'est de définir la taille dans un define comme ça:

#define MESSAGE_SIZE 141
char messageToSend[MESSAGE_SIZE];
char messageToReceive[MESSAGE_SIZE]

Ainsi le code reste clair et net, la taille peut être réutilisée à divers endroits (donc on est sur d'avoir la même taille partout). De plus, comme c'est résolu a la compilation, on économise des calculs inutiles sur l'arduino.

Cela t'éclaire?

Autre remarque, on est bien d'accord que strlenf retourne le nombre de caractère entre le début de la chaine et le caractère null (/0) terminal? Si tu écrit 141 caractères tout pile, tu n'aura pas de caractère null et du coup tu aura une segfault ici. A mon avis tu ferais mieux d'utiliser MESSAGE_SIZE et tampis pour les X caractères perdus.

Non atrakeur, un char fait 1 byte et pas 4. Et un pointeur fait 2 bytes et pas 8.

On peut calculer sans problèmes (et heureusement...) le nombre d'éléments dans un tableau en divisant la taille totale du tableau par la taille d'un élément du tableau...

sizeof( tableau ) / sizeof( tableau[0] )

Comme ici c'est un tableau de char, ça donnerait 141 / 1 = 141. Si c'était un tableau de long ça donnerait 564 / 4 = 141. sizeof est lui aussi résolu à la compilation, donc un calcul comme celui-ci devient une constante après compilation :slight_smile:

On est d'accord que messageToReceive va avoir la meme taille que messageToSend, soit 141?

Oui, mais attention, comme expliqué ci-dessus, ça fonctionne uniquement parce que un char pèse un byte

et que message lui aurra la taille correspondant au nombre de caractere contenu dans messageToSend?

Oui, bien que je ne connaisse pas la fonction strlenf, je ne connais que strlen donc je suppose que c'est une erreur de frappe.

Salut Atrakeur et guix,

Merci pour ces précisions. Oui c'est claire maintenant. Toute belle journée