Initialisation d'un tableau de char par une chaine constante

Le
candide
Bonjour,

Les déclaration (de portée une fonction) suivantes :

char t1[100]={0};

et

char t2[100]="0";

initialisent-elles les tableaux de la même façon ?

Il est clair que la valeur de chaque élément de t1 est 0 et que la valeur du
premier élément de t2 aussi mais peut-on dire plus concernant t2 ?

De son côté la Norme dit :

An array of character type may be initialized by a character string literal,
optionally enclosed in braces. Successive characters of the character string
literal (including the terminating null character if there is room or if the
array is of unknown size) initialize the elements of the array.

et l'initialisation y est définie par :

An initializer specifies the initial value stored in an object.

(ce que je trouve assez peu précis).

Merci
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 5
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Erwan David
Le #19934431
candide
Bonjour,

Les déclaration (de portée une fonction) suivantes :

char t1[100]={0};

et

char t2[100]="0";

initialisent-elles les tableaux de la même façon ?

Il est clair que la valeur de chaque élément de t1 est 0 et que la valeur du
premier élément de t2 aussi mais peut-on dire plus concernant t2 ?



Non, t2[0] vaut 48 (en supposant que le jeu de caractère de base soit
l'ascii) alors que t1[0] vaut 0.

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
candide
Le #19934511
Erwan David a écrit :

Non, t2[0] vaut 48 (en supposant que le jeu de caractère de base soit
l'ascii) alors que t1[0] vaut 0.





Oops, je voulais écrire


char t2[100]="";


désolé.
candide
Le #19934581
candide a écrit :


char t2[100]="0";




Typo, mes excuses. Lire :

char t2[100]="";
Pierre Maurette
Le #19934721
candide, le 15/08/2009 a écrit :
Bonjour,

Les déclaration (de portée une fonction) suivantes :

char t1[100]={0};

et

char t2[100]="0";

initialisent-elles les tableaux de la même façon ?

Il est clair que la valeur de chaque élément de t1 est 0 et que la valeur du
premier élément de t2 aussi mais peut-on dire plus concernant t2 ?



Oui, on peut dire que t2 sera initialisée entièrement, à {'0', '',
'', ...., ''}, ou après correction de l'erreur de typo[*], {'',
'', '', ...., ''}. C'est dans §6.7.8.21, mais bon, la norme... Le
truc à mémoriser, c'est en gros que les objets /static storage
duration/ sont systématiquement initialisés, en descendant
récursivement jusqu'aux types simples, par des valeurs /nulles/[**] si
elles ne sont pas explicitement indiquées. Les objets /automatic
storage duration/ non explicitement initialisés ont un contenu initial
indéterminé. Mais s'ils sont incomplètement explicitement initialisés,
on leur applique les mêmes règles que les /static storage duration/.


[*] Le supersedes, c'est pratique, quand même.

[**] Ça dépend du type, et ça ne signifie pas que tous les bits de
l'objet sont à 0.

--
Pierre Maurette
candide
Le #19934811
Pierre Maurette a écrit :

'', '', ...., ''}. C'est dans §6.7.8.21,



Exact. Ça ne figure pas dans la Norme C90 (qui est celle que je consulte en
priorité car j'ai une version papier). C99 dit en effet, comme tu le précises
ci-dessous :

all subobjects that are not initialized explicitly shall be initialized
implicitly the same as objects that have static storage duration.




mais bon, la norme...



Ben si parce que sinon à quoi va-t-on se référer pour décider ?


ou après correction de l'erreur de typo[*], {'',
(...)
[*] Le supersedes, c'est pratique, quand même.




Tu sous-entends quelque chose ?


[**] Ça dépend du type, et ça ne signifie pas que tous les bits de
l'objet sont à 0.




Oui, je connais mes classiques.
-ed-
Le #19935791
On 15 août, 21:54, candide
Bonjour,

Les déclaration (de portée une fonction) suivantes :

char t1[100]={0};

et

char t2[100]="0";

initialisent-elles les tableaux de la même façon ?



Oui.Chaque byte du tableau prend la valeur 0.

Il est clair que la valeur de chaque élément de t1 est 0 et que la va leur du
premier élément de t2 aussi mais peut-on dire plus concernant t2 ?



Quand on fait une initialisation partielle, tout ce qui est implicite
est mis à 0.

char x[3] = {'a'};

donne

{'a', 0, 0}

c'est garanti par la norme.

De son côté la Norme dit :

An array of character type may be initialized by a character string liter al,
optionally enclosed in braces. Successive characters of the character str ing
literal (including the terminating null character if there is room



char s[8] = "Hello";

donne

{'H','e','l','l','o',0, 0, 0} (chaine valide)

or if the
array is of unknown size) initialize the elements of the array.



char s[] = "Hello";

done

{'H','e','l','l','o',0} (chaine valide)


Attention :

char s[5] = "Hello";

donne :

{'H','e','l','l','o'} (chaine invalide)

et l'initialisation y est définie par :

An initializer specifies the initial value stored in an object.

(ce que je trouve assez peu précis).



Alors propose une définition plus précise...
-ed-
Le #19935781
On 15 août, 22:46, candide
Erwan David a écrit :

> Non, t2[0] vaut 48 (en supposant que le jeu de caractère de base soit
> l'ascii) alors que t1[0] vaut 0.

Oops, je voulais écrire

char t2[100]="";

désolé.



et c'est ce j'ai lu ! Oups aussi !
candide
Le #19937551
-ed- a écrit :


char x[3] = {'a'};

donne

{'a', 0, 0}

c'est garanti par la norme.



Exact, y compris dans C90 contrairement à ce que j'ai affirmé un peu rapidement.
bpascal123
Le #19942661
On 15 août, 21:54, candide
Bonjour,

Les déclaration (de portée une fonction) suivantes :

char t1[100]={0};

et

char t2[100]="0";

initialisent-elles les tableaux de la même façon ?

Il est clair que la valeur de chaque élément de t1 est 0 et que la va leur du
premier élément de t2 aussi mais peut-on dire plus concernant t2 ?

De son côté la Norme dit :

An array of character type may be initialized by a character string liter al,
optionally enclosed in braces. Successive characters of the character str ing
literal (including the terminating null character if there is room or if the
array is of unknown size) initialize the elements of the array.

et l'initialisation y est définie par :

An initializer specifies the initial value stored in an object.

(ce que je trouve assez peu précis).

Merci



Bonjour

La traduction serait :

Une gamme de valeurs de type caractères peut être initialisée
optionnellement entre des parenthèses bracelets, par une chaîne de
caractères au sens textuel. Les caractères successifs d'une chaîne au
sens textuel (inclus le caractère de terminaison s'il y a de la place
ou si le nombre de valeurs de la gamme est inconnue) initialisent les
éléments de la gamme de valeurs.

La traduction n'est pas évidente vu le peu de place laissé à
l'approximation du langage C. Je pense que dans la dernière phrase,
élément pourrait devenir :

...initialisent le nombre d'éléments de la gamme de valeurs.

Ca voudrait dire que :

char t1[100] = { "0" } ;
char t2[] = "0" ; ===> taille inconnue initialisée par les
caractères successifs... : tableau de 2 éléments : '0' et '' soit 2
octets

Pascal
-ed-
Le #19945891
On 17 août, 18:08, ""


char t1[100] = { "0" } ;



N'existe pas. C'est

char t1[100] = "0" ;

ou

char t1[100] = { '0' } ;

char t2[] = "0" ;   ===> taille inconnue initialisée par les
caractères successifs... : tableau de 2 éléments : '0' et '' soit 2
octets



J'éviterais de parler d'octets, s'agissant de char (donc de bytes).
Publicité
Poster une réponse
Anonyme