Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Je dirais que oui (en plus, pas de warning) mais quand même j'ai un doute :
bien
que les chaînes littérales soient en mémoire statique, le compilateur va-t-il
retourner la même adresse à chaque appel ?
Bon en fait quand on dit que les
chaînes sont en mémoire statique, je trouve que c'est un peu vague. La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je
vois
pas l'intérêt de le faire ?
Par contre si on écrit
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
D'ailleurs, dans le premier exemple, la variable ok a-t-elle toujours la même
valeur ? Je crois que oui mais j'ai un petit doute.
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Je dirais que oui (en plus, pas de warning) mais quand même j'ai un doute :
bien
que les chaînes littérales soient en mémoire statique, le compilateur va-t-il
retourner la même adresse à chaque appel ?
Bon en fait quand on dit que les
chaînes sont en mémoire statique, je trouve que c'est un peu vague. La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je
vois
pas l'intérêt de le faire ?
Par contre si on écrit
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
D'ailleurs, dans le premier exemple, la variable ok a-t-elle toujours la même
valeur ? Je crois que oui mais j'ai un petit doute.
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Je dirais que oui (en plus, pas de warning) mais quand même j'ai un doute :
bien
que les chaînes littérales soient en mémoire statique, le compilateur va-t-il
retourner la même adresse à chaque appel ?
Bon en fait quand on dit que les
chaînes sont en mémoire statique, je trouve que c'est un peu vague. La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je
vois
pas l'intérêt de le faire ?
Par contre si on écrit
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
D'ailleurs, dans le premier exemple, la variable ok a-t-elle toujours la même
valeur ? Je crois que oui mais j'ai un petit doute.
Bonjour
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Je dirais que oui (en plus, pas de warning) mais quand même j'ai un dou te : bien
que les chaînes littérales soient en mémoire statique,
retourner la même adresse à chaque appel ? Bon en fait quand on dit q ue les
chaînes sont en mémoire statique, je trouve que c'est un peu vague.
La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je vois
pas l'intérêt de le faire ?
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
D'ailleurs, dans le premier exemple, la variable ok a-t-elle toujours la même
valeur ? Je crois que oui mais j'ai un petit doute.
Bonjour
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Je dirais que oui (en plus, pas de warning) mais quand même j'ai un dou te : bien
que les chaînes littérales soient en mémoire statique,
retourner la même adresse à chaque appel ? Bon en fait quand on dit q ue les
chaînes sont en mémoire statique, je trouve que c'est un peu vague.
La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int toto=42, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je vois
pas l'intérêt de le faire ?
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
D'ailleurs, dans le premier exemple, la variable ok a-t-elle toujours la même
valeur ? Je crois que oui mais j'ai un petit doute.
Bonjour
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Je dirais que oui (en plus, pas de warning) mais quand même j'ai un dou te : bien
que les chaînes littérales soient en mémoire statique,
retourner la même adresse à chaque appel ? Bon en fait quand on dit q ue les
chaînes sont en mémoire statique, je trouve que c'est un peu vague.
La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je vois
pas l'intérêt de le faire ?
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
D'ailleurs, dans le premier exemple, la variable ok a-t-elle toujours la même
valeur ? Je crois que oui mais j'ai un petit doute.
On 11 juil, 17:04, candide wrote:Bonjour
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Les deux sont identiques (et probablement codés de la même façon en
asm) et aussi douteux :
Compiling: main.c
C:devhellomain.c: In function `fa':
C:devhellomain.c:3: warning: initialization discards qualifiers
from pointer target type
C:devhellomain.c: In function `fb':
C:devhellomain.c:10: warning: return discards qualifiers from
pointer target type
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 2 warnings
Elles sont en mémoire "permanente" (la durée de vie est celle du
programme). Rien ne dit qu'il s'agisse de la mémoire statique (donc
modifiable).
Ca pourrait très bien être une adresse correspondant à de
la mémoire en lecture seule voire à de la ROM (c'est souvent le cas en
embarqué). Le 'const' n'est pas une option...
char const *fa (void)
{
char const *ok = "OK";
return ok;
}
char const *fb (void)
{
return "OK";
}
Compiling: main.c
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings
le compilateur va-t-ilretourner la même adresse à chaque appel ? Bon en fait quand on dit que les
Oui.chaînes sont en mémoire statique, je trouve que c'est un peu vague.
C'est même carrément faux.
La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
"duration" fait toute la différence. "static storage duration"
signifie "de durée de vie permanente". Ca ne donne aucune indication
sur la classe de stockage qui dépend de l'implémentation.
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je vois
pas l'intérêt de le faire ?
Il la place où il veut. Ici, il pourrait très bien remplacer strlen
("zozo") par 4, directement, selon son degré d'optimisation et
d'intelligence... Il n'y aurait donc pas de chaine "toto" en mémoire
permanente (aka 'de durée de vie "statique"')..
On 11 juil, 17:04, candide <cand...@free.invalid> wrote:
Bonjour
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Les deux sont identiques (et probablement codés de la même façon en
asm) et aussi douteux :
Compiling: main.c
C:devhellomain.c: In function `fa':
C:devhellomain.c:3: warning: initialization discards qualifiers
from pointer target type
C:devhellomain.c: In function `fb':
C:devhellomain.c:10: warning: return discards qualifiers from
pointer target type
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 2 warnings
Elles sont en mémoire "permanente" (la durée de vie est celle du
programme). Rien ne dit qu'il s'agisse de la mémoire statique (donc
modifiable).
Ca pourrait très bien être une adresse correspondant à de
la mémoire en lecture seule voire à de la ROM (c'est souvent le cas en
embarqué). Le 'const' n'est pas une option...
char const *fa (void)
{
char const *ok = "OK";
return ok;
}
char const *fb (void)
{
return "OK";
}
Compiling: main.c
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings
le compilateur va-t-il
retourner la même adresse à chaque appel ? Bon en fait quand on dit que les
Oui.
chaînes sont en mémoire statique, je trouve que c'est un peu vague.
C'est même carrément faux.
La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
"duration" fait toute la différence. "static storage duration"
signifie "de durée de vie permanente". Ca ne donne aucune indication
sur la classe de stockage qui dépend de l'implémentation.
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je vois
pas l'intérêt de le faire ?
Il la place où il veut. Ici, il pourrait très bien remplacer strlen
("zozo") par 4, directement, selon son degré d'optimisation et
d'intelligence... Il n'y aurait donc pas de chaine "toto" en mémoire
permanente (aka 'de durée de vie "statique"')..
On 11 juil, 17:04, candide wrote:Bonjour
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Les deux sont identiques (et probablement codés de la même façon en
asm) et aussi douteux :
Compiling: main.c
C:devhellomain.c: In function `fa':
C:devhellomain.c:3: warning: initialization discards qualifiers
from pointer target type
C:devhellomain.c: In function `fb':
C:devhellomain.c:10: warning: return discards qualifiers from
pointer target type
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 2 warnings
Elles sont en mémoire "permanente" (la durée de vie est celle du
programme). Rien ne dit qu'il s'agisse de la mémoire statique (donc
modifiable).
Ca pourrait très bien être une adresse correspondant à de
la mémoire en lecture seule voire à de la ROM (c'est souvent le cas en
embarqué). Le 'const' n'est pas une option...
char const *fa (void)
{
char const *ok = "OK";
return ok;
}
char const *fb (void)
{
return "OK";
}
Compiling: main.c
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings
le compilateur va-t-ilretourner la même adresse à chaque appel ? Bon en fait quand on dit que les
Oui.chaînes sont en mémoire statique, je trouve que c'est un peu vague.
C'est même carrément faux.
La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
"duration" fait toute la différence. "static storage duration"
signifie "de durée de vie permanente". Ca ne donne aucune indication
sur la classe de stockage qui dépend de l'implémentation.
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je vois
pas l'intérêt de le faire ?
Il la place où il veut. Ici, il pourrait très bien remplacer strlen
("zozo") par 4, directement, selon son degré d'optimisation et
d'intelligence... Il n'y aurait donc pas de chaine "toto" en mémoire
permanente (aka 'de durée de vie "statique"')..
Le 11/07/09 17:04, dans <4a58aa11$0$10847$,
« candide » a écrit :Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Oui. Un "const char" à la place des "char", c'est mieux.
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Oui. Un "const char" à la place du "char", c'est mieux.
Bon en fait quand on dit que les
chaînes sont en mémoire statique, je trouve que c'est un peu vague. La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je
vois
pas l'intérêt de le faire ?
Les chaînes de caractères sont généralement placées dans des zones en
lecture seule, ce qui n'était pas le cas il y a bien longtemps. Il existe
des options sur certains compilateurs pour indiquer ce que l'on veut faire.Par contre si on écrit
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
Là je ne vois pas ta logique. Dans les deux cas l'adresse de la chaîne est
utilisée (par une fonction dans ton premier exemple et par une variable dans
le second), donc il faut qu'elle soit allouée en mémoire.
Si tu sous-entends que strlen("toto") doit être remplacé par 4 par le
compilateur, cela n'est pas évident car strlen peut être une fonction de
l'utilisateur qui fait tout autre chose que ce que fait la fonction de la
norme C, même si ce n'est pas bien, c'est courant.
Le 11/07/09 17:04, dans <4a58aa11$0$10847$426a74cc@news.free.fr>,
« candide » <candide@free.invalid> a écrit :
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Oui. Un "const char" à la place des "char", c'est mieux.
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Oui. Un "const char" à la place du "char", c'est mieux.
Bon en fait quand on dit que les
chaînes sont en mémoire statique, je trouve que c'est un peu vague. La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je
vois
pas l'intérêt de le faire ?
Les chaînes de caractères sont généralement placées dans des zones en
lecture seule, ce qui n'était pas le cas il y a bien longtemps. Il existe
des options sur certains compilateurs pour indiquer ce que l'on veut faire.
Par contre si on écrit
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
Là je ne vois pas ta logique. Dans les deux cas l'adresse de la chaîne est
utilisée (par une fonction dans ton premier exemple et par une variable dans
le second), donc il faut qu'elle soit allouée en mémoire.
Si tu sous-entends que strlen("toto") doit être remplacé par 4 par le
compilateur, cela n'est pas évident car strlen peut être une fonction de
l'utilisateur qui fait tout autre chose que ce que fait la fonction de la
norme C, même si ce n'est pas bien, c'est courant.
Le 11/07/09 17:04, dans <4a58aa11$0$10847$,
« candide » a écrit :Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Oui. Un "const char" à la place des "char", c'est mieux.
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Oui. Un "const char" à la place du "char", c'est mieux.
Bon en fait quand on dit que les
chaînes sont en mémoire statique, je trouve que c'est un peu vague. La Norme,
elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je
vois
pas l'intérêt de le faire ?
Les chaînes de caractères sont généralement placées dans des zones en
lecture seule, ce qui n'était pas le cas il y a bien longtemps. Il existe
des options sur certains compilateurs pour indiquer ce que l'on veut faire.Par contre si on écrit
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
Là je ne vois pas ta logique. Dans les deux cas l'adresse de la chaîne est
utilisée (par une fonction dans ton premier exemple et par une variable dans
le second), donc il faut qu'elle soit allouée en mémoire.
Si tu sous-entends que strlen("toto") doit être remplacé par 4 par le
compilateur, cela n'est pas évident car strlen peut être une fonction de
l'utilisateur qui fait tout autre chose que ce que fait la fonction de la
norme C, même si ce n'est pas bien, c'est courant.
Eric Levenez a écrit :Le 11/07/09 17:04, dans <4a58aa11$0$10847$,
« candide » a écrit :Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Oui. Un "const char" à la place des "char", c'est mieux.
Dit comme cela, je l'accepte volontiers.
Sinon, concernant le code que j'ai écrit, ok est une variable locale qui
renvoie l'adresse d'un objet statique, donc ça ne pose pas de problème de
retour. En revanche celui-ci en pose :
char *h(void)
{
char ok[]="OK";
return ok;
}
comme me le confirme le compilateur alors que l'action est la même. Vous
allez peut-être me dire que l'adresse de "OK" n'est pas forcément la même que
la valeur de ok et donc que peut-être "OK" est recopié provisoirement.
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Oui. Un "const char" à la place du "char", c'est mieux.
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;)
). Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
?
Bon en fait quand on dit que les
chaînes sont en mémoire statique, je trouve que c'est un peu vague. La
Norme, elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je
vois
pas l'intérêt de le faire ?
Les chaînes de caractères sont généralement placées dans des zones en
lecture seule, ce qui n'était pas le cas il y a bien longtemps. Il existe
des options sur certains compilateurs pour indiquer ce que l'on veut faire.Par contre si on écrit
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
Là je ne vois pas ta logique. Dans les deux cas l'adresse de la chaîne est
utilisée (par une fonction dans ton premier exemple et par une variable dans
le second), donc il faut qu'elle soit allouée en mémoire.
Oui, j'aurais dû prendre sizeof au lieu de strlen. Je comprends que tu ne
comprennes pas ma logique mais ça reste troublant que "zozo" soit un objet
qui ait une adresse mémoire surtout si on n'a pas besoin de l'adresse (si
c'est jsute pour compter le nombre de caractères). Quand on écrit
int zB;
on ne se pose pas la question de savoir où la r-value 42 se trouve en
mémoire.
Si tu sous-entends que strlen("toto") doit être remplacé par 4 par le
compilateur, cela n'est pas évident car strlen peut être une fonction de
l'utilisateur qui fait tout autre chose que ce que fait la fonction de la
norme C, même si ce n'est pas bien, c'est courant.
Non seulement ça mais je crois que c'est interdit par la Norme.
Eric Levenez a écrit :
Le 11/07/09 17:04, dans <4a58aa11$0$10847$426a74cc@news.free.fr>,
« candide » <candide@free.invalid> a écrit :
Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Oui. Un "const char" à la place des "char", c'est mieux.
Dit comme cela, je l'accepte volontiers.
Sinon, concernant le code que j'ai écrit, ok est une variable locale qui
renvoie l'adresse d'un objet statique, donc ça ne pose pas de problème de
retour. En revanche celui-ci en pose :
char *h(void)
{
char ok[]="OK";
return ok;
}
comme me le confirme le compilateur alors que l'action est la même. Vous
allez peut-être me dire que l'adresse de "OK" n'est pas forcément la même que
la valeur de ok et donc que peut-être "OK" est recopié provisoirement.
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Oui. Un "const char" à la place du "char", c'est mieux.
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;)
). Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
?
Bon en fait quand on dit que les
chaînes sont en mémoire statique, je trouve que c'est un peu vague. La
Norme, elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je
vois
pas l'intérêt de le faire ?
Les chaînes de caractères sont généralement placées dans des zones en
lecture seule, ce qui n'était pas le cas il y a bien longtemps. Il existe
des options sur certains compilateurs pour indiquer ce que l'on veut faire.
Par contre si on écrit
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
Là je ne vois pas ta logique. Dans les deux cas l'adresse de la chaîne est
utilisée (par une fonction dans ton premier exemple et par une variable dans
le second), donc il faut qu'elle soit allouée en mémoire.
Oui, j'aurais dû prendre sizeof au lieu de strlen. Je comprends que tu ne
comprennes pas ma logique mais ça reste troublant que "zozo" soit un objet
qui ait une adresse mémoire surtout si on n'a pas besoin de l'adresse (si
c'est jsute pour compter le nombre de caractères). Quand on écrit
int zB;
on ne se pose pas la question de savoir où la r-value 42 se trouve en
mémoire.
Si tu sous-entends que strlen("toto") doit être remplacé par 4 par le
compilateur, cela n'est pas évident car strlen peut être une fonction de
l'utilisateur qui fait tout autre chose que ce que fait la fonction de la
norme C, même si ce n'est pas bien, c'est courant.
Non seulement ça mais je crois que c'est interdit par la Norme.
Eric Levenez a écrit :Le 11/07/09 17:04, dans <4a58aa11$0$10847$,
« candide » a écrit :Le code suivant est correct je pense :
char *f(void)
{
char *ok="OK";
return ok;
}
Oui. Un "const char" à la place des "char", c'est mieux.
Dit comme cela, je l'accepte volontiers.
Sinon, concernant le code que j'ai écrit, ok est une variable locale qui
renvoie l'adresse d'un objet statique, donc ça ne pose pas de problème de
retour. En revanche celui-ci en pose :
char *h(void)
{
char ok[]="OK";
return ok;
}
comme me le confirme le compilateur alors que l'action est la même. Vous
allez peut-être me dire que l'adresse de "OK" n'est pas forcément la même que
la valeur de ok et donc que peut-être "OK" est recopié provisoirement.
Et le suivant l'est-il
char *f(void)
{
return "OK";
}
Oui. Un "const char" à la place du "char", c'est mieux.
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;)
). Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
?
Bon en fait quand on dit que les
chaînes sont en mémoire statique, je trouve que c'est un peu vague. La
Norme, elle, dit :
A character string literal has static storage duration and type
"array of char ,"
mais dans un programme on écrit
int totoB, titi;
titi=toto + strlen("zozo");
le compilateur place-t-il en mémoire statique la chaîne "zozo" parce que je
vois
pas l'intérêt de le faire ?
Les chaînes de caractères sont généralement placées dans des zones en
lecture seule, ce qui n'était pas le cas il y a bien longtemps. Il existe
des options sur certains compilateurs pour indiquer ce que l'on veut faire.Par contre si on écrit
char *s="zozo";
je vois l'intérêt puisque l'adresse est utilisée par une variable
Là je ne vois pas ta logique. Dans les deux cas l'adresse de la chaîne est
utilisée (par une fonction dans ton premier exemple et par une variable dans
le second), donc il faut qu'elle soit allouée en mémoire.
Oui, j'aurais dû prendre sizeof au lieu de strlen. Je comprends que tu ne
comprennes pas ma logique mais ça reste troublant que "zozo" soit un objet
qui ait une adresse mémoire surtout si on n'a pas besoin de l'adresse (si
c'est jsute pour compter le nombre de caractères). Quand on écrit
int zB;
on ne se pose pas la question de savoir où la r-value 42 se trouve en
mémoire.
Si tu sous-entends que strlen("toto") doit être remplacé par 4 par le
compilateur, cela n'est pas évident car strlen peut être une fonction de
l'utilisateur qui fait tout autre chose que ce que fait la fonction de la
norme C, même si ce n'est pas bien, c'est courant.
Non seulement ça mais je crois que c'est interdit par la Norme.
Eric Levenez a écrit :
Oui. Un "const char" à la place des "char", c'est mieux.
Dit comme cela, je l'accepte volontiers.
Sinon, concernant le code que j'ai écrit, ok est une variable locale qui
renvoie
l'adresse d'un objet statique, donc ça ne pose pas de problème de retour. En
revanche celui-ci en pose :
char *h(void)
{
char ok[]="OK";
return ok;
}
comme me le confirme le compilateur alors que l'action est la même.
Vous allez
peut-être me dire que l'adresse de "OK" n'est pas forcément la même que la
valeur de ok et donc que peut-être "OK" est recopié provisoirement.
Oui. Un "const char" à la place du "char", c'est mieux.
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;)
Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
Là je ne vois pas ta logique. Dans les deux cas l'adresse de la chaîne est
utilisée (par une fonction dans ton premier exemple et par une variable dans
le second), donc il faut qu'elle soit allouée en mémoire.
Oui, j'aurais dû prendre sizeof au lieu de strlen. Je comprends que tu ne
comprennes pas ma logique mais ça reste troublant que "zozo" soit un objet qui
ait une adresse mémoire surtout si on n'a pas besoin de l'adresse (si c'est
jsute pour compter le nombre de caractères). Quand on écrit
int zB;
on ne se pose pas la question de savoir où la r-value 42 se trouve en mémoire.
Si tu sous-entends que strlen("toto") doit être remplacé par 4 par le
compilateur, cela n'est pas évident car strlen peut être une fonction de
l'utilisateur qui fait tout autre chose que ce que fait la fonction de la
norme C, même si ce n'est pas bien, c'est courant.
Non seulement ça mais je crois que c'est interdit par la Norme.
Eric Levenez a écrit :
Oui. Un "const char" à la place des "char", c'est mieux.
Dit comme cela, je l'accepte volontiers.
Sinon, concernant le code que j'ai écrit, ok est une variable locale qui
renvoie
l'adresse d'un objet statique, donc ça ne pose pas de problème de retour. En
revanche celui-ci en pose :
char *h(void)
{
char ok[]="OK";
return ok;
}
comme me le confirme le compilateur alors que l'action est la même.
Vous allez
peut-être me dire que l'adresse de "OK" n'est pas forcément la même que la
valeur de ok et donc que peut-être "OK" est recopié provisoirement.
Oui. Un "const char" à la place du "char", c'est mieux.
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;)
Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
Là je ne vois pas ta logique. Dans les deux cas l'adresse de la chaîne est
utilisée (par une fonction dans ton premier exemple et par une variable dans
le second), donc il faut qu'elle soit allouée en mémoire.
Oui, j'aurais dû prendre sizeof au lieu de strlen. Je comprends que tu ne
comprennes pas ma logique mais ça reste troublant que "zozo" soit un objet qui
ait une adresse mémoire surtout si on n'a pas besoin de l'adresse (si c'est
jsute pour compter le nombre de caractères). Quand on écrit
int zB;
on ne se pose pas la question de savoir où la r-value 42 se trouve en mémoire.
Si tu sous-entends que strlen("toto") doit être remplacé par 4 par le
compilateur, cela n'est pas évident car strlen peut être une fonction de
l'utilisateur qui fait tout autre chose que ce que fait la fonction de la
norme C, même si ce n'est pas bien, c'est courant.
Non seulement ça mais je crois que c'est interdit par la Norme.
Eric Levenez a écrit :
Oui. Un "const char" à la place des "char", c'est mieux.
Dit comme cela, je l'accepte volontiers.
Sinon, concernant le code que j'ai écrit, ok est une variable locale qui
renvoie
l'adresse d'un objet statique, donc ça ne pose pas de problème de retour. En
revanche celui-ci en pose :
char *h(void)
{
char ok[]="OK";
return ok;
}
comme me le confirme le compilateur alors que l'action est la même.
Vous allez
peut-être me dire que l'adresse de "OK" n'est pas forcément la même que la
valeur de ok et donc que peut-être "OK" est recopié provisoirement.
Oui. Un "const char" à la place du "char", c'est mieux.
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;)
Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
Là je ne vois pas ta logique. Dans les deux cas l'adresse de la chaîne est
utilisée (par une fonction dans ton premier exemple et par une variable dans
le second), donc il faut qu'elle soit allouée en mémoire.
Oui, j'aurais dû prendre sizeof au lieu de strlen. Je comprends que tu ne
comprennes pas ma logique mais ça reste troublant que "zozo" soit un objet qui
ait une adresse mémoire surtout si on n'a pas besoin de l'adresse (si c'est
jsute pour compter le nombre de caractères). Quand on écrit
int zB;
on ne se pose pas la question de savoir où la r-value 42 se trouve en mémoire.
Si tu sous-entends que strlen("toto") doit être remplacé par 4 par le
compilateur, cela n'est pas évident car strlen peut être une fonction de
l'utilisateur qui fait tout autre chose que ce que fait la fonction de la
norme C, même si ce n'est pas bien, c'est courant.
Non seulement ça mais je crois que c'est interdit par la Norme.
Sinon, concernant le code que j'ai écrit, ok est une variable locale qu i renvoie
l'adresse d'un objet statique, donc ça ne pose pas de problème de ret our. En
revanche celui-ci en pose :
char *h(void)
{
char ok[]="OK";
return ok;
}
comme me le confirme le compilateur alors que l'action est la même.
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;) ).
Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
?
jsute pour compter le nombre de caractères). Quand on écrit
int zB;
on ne se pose pas la question de savoir où la r-value 42 se trouve en m émoire.
Sinon, concernant le code que j'ai écrit, ok est une variable locale qu i renvoie
l'adresse d'un objet statique, donc ça ne pose pas de problème de ret our. En
revanche celui-ci en pose :
char *h(void)
{
char ok[]="OK";
return ok;
}
comme me le confirme le compilateur alors que l'action est la même.
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;) ).
Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
?
jsute pour compter le nombre de caractères). Quand on écrit
int z=42;
on ne se pose pas la question de savoir où la r-value 42 se trouve en m émoire.
Sinon, concernant le code que j'ai écrit, ok est une variable locale qu i renvoie
l'adresse d'un objet statique, donc ça ne pose pas de problème de ret our. En
revanche celui-ci en pose :
char *h(void)
{
char ok[]="OK";
return ok;
}
comme me le confirme le compilateur alors que l'action est la même.
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;) ).
Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
?
jsute pour compter le nombre de caractères). Quand on écrit
int zB;
on ne se pose pas la question de savoir où la r-value 42 se trouve en m émoire.
L'action n'est pas la même car là tu ne retournes pas l'adresse de la chaîne
constante, mais l'adresse d'une variable dans la pile. Ton code est
identique à :
int *h(void)
{
int ok = 42;
return &ok;
}
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;)
C'est très courant.
L'action n'est pas la même car là tu ne retournes pas l'adresse de la chaîne
constante, mais l'adresse d'une variable dans la pile. Ton code est
identique à :
int *h(void)
{
int ok = 42;
return &ok;
}
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;)
C'est très courant.
L'action n'est pas la même car là tu ne retournes pas l'adresse de la chaîne
constante, mais l'adresse d'une variable dans la pile. Ton code est
identique à :
int *h(void)
{
int ok = 42;
return &ok;
}
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien ! ;)
C'est très courant.
char ok[]="OK";
est strictement équivalent à:
char ok[] = {'O', 'K', ' '};
ou
char ok[3] = {'O', 'K', ' '};
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien
! ;) ). Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
?
Parce que la fonction est prévue pour fonctionner sur des tableaux
modifiables. Un rechercher - remplacer par exemple. Le const indique que
la fonction ne modifiera pas s, et l'utilisateur sachant ce qu'il envoie
à la fonction fera ce que bon lui semble du retour (une copie de valeur
de pointeur), en particulier l'affectera à un char* ou un const char*.
char ok[]="OK";
est strictement équivalent à:
char ok[] = {'O', 'K', ' '};
ou
char ok[3] = {'O', 'K', ' '};
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien
! ;) ). Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
?
Parce que la fonction est prévue pour fonctionner sur des tableaux
modifiables. Un rechercher - remplacer par exemple. Le const indique que
la fonction ne modifiera pas s, et l'utilisateur sachant ce qu'il envoie
à la fonction fera ce que bon lui semble du retour (une copie de valeur
de pointeur), en particulier l'affectera à un char* ou un const char*.
char ok[]="OK";
est strictement équivalent à:
char ok[] = {'O', 'K', ' '};
ou
char ok[3] = {'O', 'K', ' '};
OK mais je n'ai pas souvent vu cela (ce qui évidemment ne prouve rien
! ;) ). Mais alors pourquoi le prototype de strchr() n'est-il pas :
const char *strchr(const char *s, int c);
au lieu de
char *strchr(const char *s, int c);
?
Parce que la fonction est prévue pour fonctionner sur des tableaux
modifiables. Un rechercher - remplacer par exemple. Le const indique que
la fonction ne modifiera pas s, et l'utilisateur sachant ce qu'il envoie
à la fonction fera ce que bon lui semble du retour (une copie de valeur
de pointeur), en particulier l'affectera à un char* ou un const char*.