Boucle de sortie infinie en C
Dans le code C fourni, une boucle sans fin inattendue se produit, imprimant une série continue de nombres ("0 , 1, 2, 3, 4, 5,...") au lieu du "0, 1, 2, 3" attendu.
Un examen plus approfondi révèle que le coupable est la déclaration d'affectation apparemment inoffensive "delta = mc[di]" dans la boucle. Cette affectation déclenche un comportement indéfini car elle accède au tableau mc hors limites lors de la dernière itération (c'est-à-dire "di = 4").
Dans le cadre d'optimisations de boucle agressives, le compilateur peut supposer l'absence de comportement indéfini. En conséquence, il optimise la boucle en éliminant le di < 4 vérification, conduisant à une exécution en boucle continue.
Pour garantir un comportement correct, il est crucial d'éviter les comportements indéfinis, même dans un code optimisé. Dans ce cas, la solution consiste à garantir que mc est accessible dans les limites de la boucle.
Une approche alternative consiste à utiliser l'indicateur -fno-aggressive-loop-optimizations dans gcc pour désactiver les optimisations de boucle agressives. Cet indicateur force le compilateur à conserver le di < 4 vérifier et empêcher le comportement indéfini qui mène à la boucle infinie.
En comprenant les conséquences potentielles d'un comportement indéfini et en prenant les mesures appropriées pour l'éviter, les programmeurs peuvent garantir la fiabilité et l'exactitude de leur code C.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!