Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Initialisation d'un tableau de char par une chaine constante

42 réponses
Avatar
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

10 réponses

1 2 3 4 5
Avatar
Erwan David
candide écrivait :

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é
Avatar
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é.
Avatar
candide
candide a écrit :


char t2[100]="0";




Typo, mes excuses. Lire :

char t2[100]="";
Avatar
Pierre Maurette
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
Avatar
candide
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.
Avatar
-ed-
On 15 août, 21:54, candide wrote:
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...
Avatar
-ed-
On 15 août, 22:46, candide wrote:
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 !
Avatar
candide
-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.
Avatar
bpascal123
On 15 août, 21:54, candide wrote:
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
Avatar
-ed-
On 17 août, 18:08, ""
wrote:


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).
1 2 3 4 5