Re,
Dac, ma réponse est correcte pour le code cité dans le post original, mais je vais tacher d'énumérer les autres différents cas de figure pour clarifier.
Le code suivant (cas 1) :
char *user;
void foo()
{
user = "toto";
puts(user);
}
équivaut à :
static char _totoString[4+1] = "toto"; // 8 en réalité pour alignement, dans un TAS (section datas INITIALISEES du binaire loadé), scope GLOBAL et lifetime GLOBAL, initialisé au LOADTIME
static char *user; // pointeur donc 4 ou 8 selon si 32 ou 64 bits, dans un TAS (section datas NON INITIALISEES du binaire loadé), scope GLOBAL et lifetime GLOBAL, initialisé au RUNTIME
void foo()
{
user = &_totoString[0]; // RUNTIME
puts(user);
}
Le code suivant (cas 2) :
char *user = "toto";
void foo()
{
puts(user);
}
équivaut à :
static char user[4+1] = "toto"; // 8 en réalité pour alignement, dans un TAS (section datas INITIALISEES du binaire loadé), scope GLOBAL et lifetime GLOBAL, initialisé au LOADTIME
void foo()
{
puts(user);
}
Le code suivant (cas 3) :
void foo()
{
char user[4+1] = "toto";
puts(user);
}
équivaut à (
Edit2: en 32 bits, si la version 64 bits vous intéresse faites le moi savoir) :
void foo()
{
char user[4+1]; // 8 en réalité pour alignement, dans la PILE, scope LOCAL et lifetime LOCAL, initialisé au RUNTIME
register unsigned int *pUser; // pointeur donc 4 ou 8 selon si 32 ou 64 bits, dans un REGISTRE, scope LOCAL et lifetime LOCAL, initialisé au RUNTIME
pUser = (unsigned int *)&user[0]; // RUNTIME
*pUser = 0x6F746F74; // dans le cas d'une architecture low-endian
pUser++; // arithmétique pointeurs donc +4 ici en 32 bits
*pUser = 0; // null terminated
puts(user);
}
MAIS pourra si la chaîne est trop longue et selon l'optimisation être traduit vers justement le cas 0 de ma réponse initiale !
C'est ce cas qui est ambigü.
Le code suivant (cas 4) :
char user[4+1];
void foo()
{
user = "toto";
puts(user);
}
et le code suivant (cas 5) :
void foo()
{
char user[4+1];
user = "toto";
puts(user);
}
sont incorrects. Il faudra employer une méthode/fonction de copie, ou bien le faire manuellement.
Et user[] sera interprété par le compilateur comme *user dans le cadre de ce qui nous intéresse ici.Edit1: On m'a demandé de vérifier sous gcc, et donc en fait user[] :
- sous visual se comporte comme le cas 0 de ma réponse initiale (*user, conforme)
- sous gcc/mingw se comporte comme le cas 3 de cette réponse ci (user[n_auto], non conforme, et donc ambigu aussi)
Arf, ça m'apprendra à vouloir répondre en 5 minutes quand c'est merdeux comme ça.
++