Si je déclare 2 tableaux ARR1 et ARR2 en C (sous Windows) et remplissez Arr1 avec des entiers de 0 à 15, une partie du débordement va à ARR2, mais pas tout. Pourquoi? sortie: p> attendu: p>
3 Réponses :
Si vous dépassez la taille d'un tableau, c vous conduira simplement à un comportement indéfini.
La définition du comportement non défini: p> Il y a aussi une liste de comportements non définis dans C11 §j.2 Comportement non défini P> Ici, vos tableaux étaient juste emballés dans la mémoire. P> Si j'exécute ce programme sur mon ordinateur avec une autre distribution Linux et une autre compilateur, je n'aurai probablement pas le même résultat que celui-ci est un comportement indéfini. P> N'oubliez pas d'éviter un comportement indéfini P> P>
Existe-t-il une règle la manière dont les variables globales sont organisées en mémoire?
@ A.franzen Non, les variables ne sont que stockées dans la mémoire où vous avez suffisamment d'espace, la matrice aurait pu être à 3 endroits vraiment différents et nous n'aurions pas vu ce comportement mais un autre
Cela s'est probablement arrivé parce que votre Cependant, comme d'autres déjà disaient, ce comportement est totalement aléatoire et doit être évité (vous ne savez jamais si arr3 code> est arrivé à 2 positions après arrate code> en mémoire, de sorte qu'il a écrit 210 et 211 dans ceux-ci (éventuellement vide ou utilisé par une autre variable. programme) et a démarré écrivant arr3 code> en mettant 212 dans sa première cellule. P>
arr3 code> sera déclaré 1 ou 2000 positions en mémoire après arrate code>) p>
Tout le vrai vrai, mais je me demande toujours pourquoi le compilateur l'a fait. Je ne vois pas une raison évidente de l'écart.
@ A.franzen Vous ne devriez pas essayer de penser à une raison évidente, où nous parlons de comportement indéfini, les choses se passent tout simplement comme elles se produisent, n'essayez pas de le comprendre
Je ne suis pas sûr, cela pourrait être totalement aléatoire
Je pense que @ a.franzen demande à ce sujet Stackoverflow.com/q/19101449/10403061
Oui, en effet, merci pour le lien.
Ce qui est probablement ici, c'est que d'autres parties du programme ont réussi à allouer les octets de la mémoire 8 (ou 16, en fonction de l'architecture) directement après ARR2, ARR3 a donc été alloué après ces octets. Par conséquent, lorsque vous avez écrit 210 et 211, ceux-ci ont écrasé que d'autres souvenirs avant le reste ont été écrits en Arr3. P>
Nah, je ne pense pas que c'est vrai. Les variables globales ont leur espace dans le fichier objet, elles ne sont pas allouées de manière dynamique. Pour une raison quelconque, le compilateur a placé quelque chose entre les deux tableaux.
Parce qu'il n'y a pas de résultat garanti avec un comportement indéfini. Cela pourrait faire ce que vous vous attendez à ce que ce soit, cela pourrait planter le programme, ou quelque chose de totalement différent. Il n'a même pas besoin d'être cohérent sous aucune forme. Je ne le fais pas, ce n'est pas utile ni pratique, et cela va simplement être mal à la tête lorsqu'il cesse de travailler et provoque des problèmes difficiles à déboguer, tels que la corruption de la mémoire.
Lorsque vous écrasez la matrice, vous écrivez simplement l'adresse de la mémoire pour le début de la matrice plus i i> * la taille de l'int. Comment savez-vous où les autres tableaux sont alloués? Pourquoi supposeriez-vous qu'ils s'empilaient simplement l'un après l'autre en mémoire?
Ce sera parce que le compilateur aligne les matrices à des limites de 16 octets, = 4 entiers. Si vous avez utilisé un multiple de 4 au lieu de 10, ils vont probablement tomber entre eux. Mais ce comportement peut varier d'un système d'exploitation au système d'exploitation et compilateur au compilateur, alors ne vous appuyez pas dessus (et ne le faites pas en attente complète). Si vous avez besoin d'ARR1,2,3 pour être contubuleux, allouez un seul bloc de mémoire et attribuer ARR2 etR3 pour pointer vers les endroits souhaités.
Le comportement non défini n'est pas strictement aléatoire, mais cela pourrait aussi bien être. Demander pourquoi vous n'obtenez pas le comportement que vous "attendez", c'est comme demander "la nuit dernière, j'ai traversé la rue quand le signe dit ne marche pas. Je m'attendais à avoir un billet Jaywalking d'un policier. Au lieu de cela, je suis passé à court de un camion. Pourquoi? "