Initialisation d'un tableau de char par une chaine constante
42 réponses
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.
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 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.
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
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.
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.
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-
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...
On 15 août, 21:54, candide <cand...@free.invalid> 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.
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-
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 !
On 15 août, 22:46, candide <cand...@free.invalid> 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.
Exact, y compris dans C90 contrairement à ce que j'ai affirmé un peu rapidement.
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
On 15 août, 21:54, candide <cand...@free.invalid> 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
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-
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).
On 17 août, 18:08, "bpascal...@googlemail.com"
<bpascal...@googlemail.com> 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).