Bonjour,
Juste une question, est-ce que:
peut avoir des comportement indéfinis alors que:Code:
1
2 char buf[256]; buf[0] = '\0';
non?Code:
1
2 char buf[256]; memset (buf, '\0', sizeof (buf);
Merci
Version imprimable
Bonjour,
Juste une question, est-ce que:
peut avoir des comportement indéfinis alors que:Code:
1
2 char buf[256]; buf[0] = '\0';
non?Code:
1
2 char buf[256]; memset (buf, '\0', sizeof (buf);
Merci
Comme buf semble être une chaîne de caractères, alors les deux sont valides. En effet, une chaîne de caractères se termine par '\0' donc tout ce qui suit après est tout bonnement ignoré.
oui mais est-ce que la première notation peut avoir des comportements indifinis qui peuvent nuir au fonctionnement de l'application?
toutes les fonctions qui utilisent les chaines de charactere sauront quoi faire si elles trouvent un 0 a la fin de la chaine.
si le 0 est au debut (premier cas), la chaine est terminée:: la chaine est 'vide'.
j'aurais tendance a utiliser le premier cas quand je suis sur de toujours passer &buf[0] a mes fonctions.
si je dois passer buf+i, j'utilise plutot le memset.
sinon il me semble qu'on peux faire:
char buf[256] = 0;
meme resultat que le memset ... mais au niveau code machine, je suis pas certain que le compilo fasse la meme chose. (j'en sais strictement rien en fait: ce serait interressant d'avoir l'avis de quelqu'un qui sais.)
Non. Comme je l'ai dis, tout ce qui suit le '\0' est tout bonnement ignoré, donc que cela soit initialisé ou non n'a pas d'importance...Citation:
oui mais est-ce que la première notation peut avoir des comportements indifinis qui peuvent nuir au fonctionnement de l'application?
J'avoue ne pas bien comprendre. D'abord, tu sors du tableau (de taille 256 donc ses élements vont de 0 à 255 compris). Ensuite, si c'est une erreur et que tu voulais écrire buf[255], alors tu ne modifie que le caractère 255 alors qu'avec memset tu mets tous les caractères à 0.Citation:
char buf[256] = 0;
meme resultat que le memset ...
Les deux sont valides.Citation:
Envoyé par Goundy
Non.Citation:
Envoyé par Goundy
Gné ! C'est une définition !Citation:
Envoyé par ShootDX
Ben si si on remplit la chaîne bêtement en faisant des trucs du style
en oubliant de mettre le zéro final.Code:
1
2
3
4 while ((c = fgetc(stdin)) != EOF && i < max) { tab[i++] = (char)c; }
(ce n'est pas forcément à recommender je te l'accorde, mais au moins le memset permet de se protéger).
C'est un tableau !Citation:
Envoyé par Dark_Ebola
Code:char buf[256] = {0};
Lorsqu'on défini un tableau avec une initialisation partielle, l'ensemble des valeurs non explicites est mis à 0.Citation:
meme resultat que le memset ... mais au niveau code machine, je suis pas certain que le compilo fasse la meme chose. (j'en sais strictement rien en fait: ce serait interressant d'avoir l'avis de quelqu'un qui sais.)
c'est garanti par le langage, que la variable soit 'static' ou 'auto'.Code:
1
2
3
4 char a[4] = {'a'}; assert (a[0] == 'a'); assert (a[3] == 0);
Merci :)
:oops: , evidement ... je me trompe toujours (heuresement que le compilo me le signale ^^)Citation:
Envoyé par Emmanuel Delahaye
et au niveau code machine generée par le compilo? tu sais si y'as une methode a preferer?
une initialisation ou un memset?
ou alors les compilos 'intelligents' generent le meme code machine?
(je sais que ca sors un peu du cadre du sujet initial.)
Code machine ? C'est quoi ça :DCitation:
Envoyé par Dark_Ebola
Par contre, pour les types autres que char, memset() avec 0 n'est pas portable. En effet, on ne sait pas si le représentation 'all-bit-to-zero' est valide. Ca dépend de l'implémentation, alors que l'init est portable.
Je préfère donc utiliser l'init. (très pratique dans le boucles...)