Je pourrais être stupide et vous devez vous excuser dans ce cas ... mais je ne comprends pas ça. J'augmente un tampon de 16 caractères, puis (en boucle de boucle), mettez-le en 23 caractères aléatoires, puis imprimez ce produit.
Ce que je ne reçois pas, c'est comment je peux mettre 23 caractères Un tampon qui est Malloc'ed sous forme de caractères ... lorsque je change de boucle à 24 caractères, je reçois une erreur (au moins sous Linux avec GCC) ... mais pourquoi pas "plus tôt" (17 caractères devraient le casser. ..no?) P>
Ceci est mon exemple de code: p>
4 Réponses :
Vous produisez une erreur, mais comme beaucoup de bogues, cela ne se passe-t-il pas. C'est tout ce qu'il y a. P>
Ce pourrait être pour une des nombreuses raisons - probablement que la manière dont le magasin libre est structuré, il existe un espace libre entre les allocations, car le système a besoin (ou des désirs) de conserver des adresses de blocs allocatables alignés sur certaines limites. Ainsi écrit un petit passé votre bloc attribué n'interfère pas avec les structures de données de magasins libres, mais un peu plus loin et ils le font. P>
Il est également tout à fait possible que votre bogue ait corrompu quelque chose que le gestionnaire de magasins Free utilisait, mais il vient de ne pas être utilisé dans votre programme simple afin que l'erreur ne soit pas remarquée (encore). P>
Pour clarifier - l'OP est probablement utilisé dans des langues de niveau supérieur, lorsque de telles erreurs sont capturées. C est délibérément dangereux, et un tel comportement en C est appelé "comportement non défini" par la norme, ce qui signifie que le code peut faire tout ce qu'il plaise. La plupart du temps, il fera la chose la plus facile qui puisse ignorer le fait que vous n'êtes pas autorisé à écrire dans cet espace et à le faire quand même. C'est la raison principale C est si difficile - il n'y a rien de vérifier quand vous faites quelque chose de mal.
Merci beaucoup pour vos réponses.
La plupart des stratégies d'allocation de mémoire autour de votre demande Malloc jusqu'à une valeur de quantification. Souvent 16 ou 32 octets. Cette quantification se produit généralement une fois que l'allocator a ajouté dans ses frais généraux (utilisé pour suivre les blocs alloués), il est donc courant de constater que vous pouvez envahir un malloc par un petit nombre d'octets sans faire de dégâts réels au tas, en particulier lorsque la taille de l'allocation est impair. p>
Bien sûr, ce n'est pas quelque chose que vous souhaitez dépendre de ce que c'est un détail de mise en œuvre de la bibliothèque d'exécution C et est soumis à changement sans préavis. P>
en C, vous vous échapperez avec ce genre de choses. Parfois, d'autres parties des programmes peuvent entrer et écraser la zone que vous n'êtes pas censé utiliser. Il vaut mieux ne pas tester ces choses. P>
Le comportement lorsque vous envahissez un tampon en C est indéfini. Donc, tout peut arriver, y compris rien. Spécifiquement C n'est pas requis et est conçu intentionnellement de ne pas effectuer la vérification des limites. P>
Si vous obtenez une erreur d'exécution du tout, il sera généralement dû au fait que celui-ci a été détecté et piégé par le système d'exploitation, non par le temps d'exécution C. Et cela ne se produira que si l'accès empiète sur la mémoire non mappée sur le processus. Plus souvent, cela accédera simplement à la mémoire appartenant à votre processus, mais qui peut être utilisé par d'autres objets de mémoire; Le comportement de votre programme dépendra alors de votre code avec les données non valides. P>
Probablement un duplicata: Stackoverflow.com/questions/1240970/... Stackoverflow.com/questions/2336796/weird-behavior-Of-Malloc