Vous rencontrez un problème d'alignement des données. Cela est probablement dû à la tentative de lecture ou d'écriture via un mauvais pointeur.
Un problème d'alignement des données se produit lorsque l'adresse pointée vers un pointeur n'est pas correctement alignée. Par exemple, certaines architectures (l'ancien Cray 2 par exemple) exigent que toute tentative de lecture de tout autre élément que la mémoire se fasse uniquement à travers un pointeur dans lequel les 3 derniers bits de la valeur du pointeur sont 0. Si l'un des 3 bits sont 1, le matériel va générer une erreur d'alignement qui entraînera le genre de problème que vous voyez.
La plupart des architectures ne sont pas si strictes, et souvent l'alignement requis dépend du type exact auquel on accède. Par exemple, un entier de 32 bits peut nécessiter que les 2 derniers bits du pointeur soient 0, mais un flottant de 64 bits peut exiger que les 3 derniers bits soient 0.
Les problèmes d'alignement sont généralement causés par les mêmes types de problèmes qui provoquent une erreur SEGFAULT ou de segmentation. Habituellement un pointeur qui n'est pas initialisé. Mais il peut être provoqué par un mauvais allocateur de mémoire qui ne retourne pas les pointeurs avec l'alignement correct, ou par le résultat de l'arithmétique de pointeur sur le pointeur quand il n'est pas du bon type.
L'implémentation système de malloc
et/ou operator new
est presque certainement correcte ou votre programme se bloque bien avant qu'il ne le soit actuellement. Donc, je pense que le mauvais allocateur de mémoire est l'arbre le moins susceptible d'aller aboyer. Je vérifierais d'abord pour un pointeur non initialisé et puis l'arithmétique de mauvais pointeur.
Merci pour la réponse. Dans mon cas, ma fonction renvoie un caractère. il ne manque pas tous les temps . Je vais vérifier votre lien wiki. – Hemant
@Hermant: Je ne vérifie pas la valeur de retour, qui est généralement passée dans un registre. Je verrais les arguments de la fonction. –
ma fonction ne prend aucun argument. appel est comme si (abcd-> foo() == 'X') // faire quelque chose d'autre /sinon partie – Hemant