tableaux qui ne sont pas lvalues ​​et ressortingction de points de séquence

Dans ISO C99, les tableaux qui ne sont pas des valeurs ld tombent tout de même en pointeurs et peuvent être en indice, bien qu’ils ne puissent être ni modifiés ni utilisés après le sharepoint séquence suivant. ( source )

Je comprends que cette fonctionnalité autorise l’indexation de tableaux dans les cas où une fonction renvoyant une structure contenant un tableau, ce qui n’est pas autorisé dans C89 ( http://yarchive.net/comp/struct_return.html ).

voulez-vous m’aider à comprendre pourquoi il y a une ressortingction d’utilisation / modification après le prochain sharepoint séquence?

Notez que le texte OP cité est extrait de la documentation de GCC. Le texte pertinent de C99 pour sauvegarder cette citation est:

C99 6.5.2.2/5

Si vous tentez de modifier le résultat d’un appel de fonction ou d’y accéder après le sharepoint séquence suivant, le comportement n’est pas défini.

et aussi de la liste des modifications dans l’avant-propos:

conversion de tableau en pointeur non limité à lvalues

Je n’ai pas le texte C89 à comparer, mais la description C99 de la conversion de tableau à pointeur (6.3.2.1/3) ne mentionne aucune ressortingction à ce que le tableau soit une valeur lvalue. De plus, la section C99 sur l’indice (6.5.2.1/2) parle de l’expression en tant que indice sous forme d’ expression postfixe , elle ne mentionne pas non plus les valeurs.


Considérons ce code:

struct foo { char buf[20]; }; struct foo foo(char const *p) { struct foo f; strcpy(f.buf, p); return f; } int main() { char *hello = foo("hello").buf; char *bye = foo("bye").buf; // other stuff... printf("%s\n", hello); printf("%s\n", bye); } 

Où les pointeurs hello et au bye pointent-ils? Le but de cette clause est de dire que le compilateur n’a pas à garder quelque part tous les objects renvoyés en mémoire pour que ces pointeurs restnt valables indéfiniment.

Au lieu de cela, le hello n’est valide que jusqu’au prochain ; dans ce cas (ou le sharepoint séquence suivant en général). Cela laisse le compilateur libre d’implémenter les structures renvoyées par valeur en tant que paramètre de pointeur masqué, comme Chris Torek le décrit dans son excellent message, qui peut être “libéré” à la fin de l’instruction en cours.

NB La situation de C99 n’est pas aussi simple que celle décrite dans le post de Chris, car ce qui suit doit fonctionner:

 printf("%s %s\n", foo("hello").buf, foo("bye").buf); 

Mon installation de gcc 4.8 semble bien fonctionner – cela fonctionne avec -std=c99 et -std=c89 avec -std=c89 .