Ma compréhension est que si char * my_word est attribué un octet de la mémoire MALLOC (1), puis techniquement, le code suivant produirait une erreur hors limites et Pourtant, le code fonctionne simplement bien et ne produit aucune erreur. En fait, printf ("% s", my_word) imprime le mot juste bien. P> Pourquoi ne produisait-il pas une erreur hors limites si je ne fais pas seulement 1 octet de mémoire? P > p>
3 Réponses :
Ceci revient au système sur lequel il s'exécute. Généralement, un MALLOC allouera dans des multiples d'une certaine taille de bloc. Par exemple, la taille du bloc peut-être 16 octets sur votre système et MALLOC allouera 16 même si vous ne l'avez demandé que 1. Donc, dans ce cas, vous vous enlevez avec la mémoire tampon, car vous n'écrivez pas à la mémoire utilisée par rien d'autre. Cependant, vous ne devriez jamais ne jamais compter sur cela. Supposons toujours que lorsque vous écrivez en dehors du montant demandé que de mauvaises choses se produiront. C ne fournit aucun mécanisme intégré pour vous protéger de la tampon débordant, c'est à vous de connaître la taille de vos tampons et de vous assurer de ne jamais lire / écrire en dehors d'eux. P>
Par exemple, si vous avez alloué un tampon, un multiple de la taille du bloc, la rédaction de l'octet suivant commencera probablement à écraser les blocs de contrôle de la mémoire critiques qui peuvent apparaître comme des erreurs bizarres plus tard lorsque vous essayez de libérer ou d'allouer plus de mémoire. p>
Une erreur de système d'exploitation ne se produira généralement que lorsque vous lisez / écriez une mémoire non allouée, cependant C alloue généralement une bande de pages qui gère ensuite ses propres réparties dans cette mesure. Les chances sont donc une petite écrasement / dépassement ne s'aventurera pas dans un système non alloué. mémoire, et plutôt quelque part où il y a une vraie mémoire. Il existe des outils tels que Valgrind ( Valgrind.org ) qui trouve spécifiquement ce type de bogue.
C n'effectue pas la vérification liée. Ce n'est que des comportements indéfinis lorsque vous accédez à des limites, ce qui signifie qu'il peut fonctionner comme normal. P>
C n'a pas de vérification explicite des limites. Cela fait partie de ce qui le rend vite. Mais lorsque vous écrivez au-delà des limites de la mémoire allouée, vous invoquez comportement non défini . P>
Une fois que vous avez invité un comportement non défini, vous ne pouvez pas prédire fiable ce que le programme fera. Il peut s'écraser, il peut produire des résultats étranges, ou (comme dans ce cas), il peut sembler fonctionner correctement. De plus, en faisant un changement apparemment sans rapport, tel que l'ajout d'un appel code> PRINTF code> Appel de débogage ou d'ajout d'une variable locale inutilisée peut modifier la manière dont le comportement indéfini se manifeste. P>
juste parce que le programme pourrait em> crash ne signifie pas que sera em>. p>
Été posé plusieurs fois.
N'oubliez pas que la devise de C: «Faites confiance au programmeur». C fait confiance au programmeur de ne pas faire des choses comme elles elles-mêmes.
Bienvenue au codage sans Roues de formation .