https://kukuruku.co/post/i-do-not-know-c/Comment fonctionne cet alias de pointeur?
Problème # 7:
#include <stdio.h>
void f(int *i, long *l)
{
printf("1. v=%ld\n", *l); /* (1) */
*i = 11; /* (2) */
printf("2. v=%ld\n", *l); /* (3) */
}
int main()
{
long a = 10;
f((int *) &a, &a);
printf("3. v=%ld\n", a);
return 0;
}
sortie sur deux compilateurs différents sur un petit système endian est:
1. v=10 2. v=11 3. v=11
1. v=10 2. v=10 3. v=11
Comment est le deuxième résultat possible? Je n'ai pas tout à fait comment l'explication qui explique le résultat en se référant à l'aliasing strict. Est-ce que le compilateur ignore complètement la ligne (2)?
Ce comportement est indéfini. * Upd: * BTW, regardé l'article, et * est * sur le comportement indéfini. Avez-vous lu ça? –
Ma conjecture est que votre compilateur 2 (quoi qu'il puisse être) fait probablement une «optimisation prématurée» – Zakir
@Zakir Les compilateurs ne sont pas sensibles à l'optimisation * prématurée .... –