2010-11-23 33 views
0

Le problème est la variable nodeType est en cours de modification après l'exécution de STRCPY. nodeType n'est pas une variable liée à l'une des autres variables utilisées dans l'appel STRCPY. C'est dans la même structure cependant. nodeType est une énumération avec la valeur int de 3.Problème de programmation C variable sans rapport étant écrasée après utilisation de STRCPY

Ci-dessous, si les informations suivantes sont probablement les plus pertinentes. J'ai enlevé la plupart des variables de l'énumération et de la structure afin qu'elles ne soient pas visibles, je suppose qu'elles ne sont pas pertinentes au problème. Je code dans VS2010 si cela fait une différence. Cela fait partie d'une affectation pour créer un arbre binaire, mais la question que j'ai n'a rien à voir avec btrees.

enum NODETYPE 
{ 
    ROOTLEAF 
}; 
typedef struct node 
{ 
    char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH]; 
    NODETYPE nodeType; 
} nodeT; 

... une partie de la fonction InsertElement

for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++) 
{ 
    strcpy(b->tempNode->key[b->tempNode->numberOfKeys - i], b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)]); 
} 

.. la fonction que j'ai appelé était l'insérer un élément. J'ai appelé la fonction plusieurs fois avant cela, mais c'est la première fois que cette section du code ci-dessous est en cours d'exécution. Après STRCPY s'exécute nodeType prend la valeur 1280070990. Je définis la variable à surveiller et tandis que son erreur dans CXX0017, ce que je suppose signifie seulement son pas dans la portée. J'ai cherché le numéro 1280070990 qui a engendré un tas de problèmes liés à des jeux de divers moteurs. Je suppose que c'est un problème d'adresse mémoire.

La solution était fournie ci-dessous. C'était une simple erreur d'écriture en dehors de la limite du tableau. J'ai cassé l'ancien code comme ça et je l'ai traversé. Cela m'a permis d'identifier le problème que j'étais en train d'écrire en dehors de la clé du tableau clé.

 for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++) 
    { 
     int sourceI = b->tempNode->numberOfKeys - i - 2; 
     int destI = b->tempNode->numberOfKeys - i - 1; 
     char *Source = b->tempNode->key[sourceI]; 
     char *Dest = b->tempNode->key[destI]; 
     strcpy(Dest, Source); 
    } 

Un regard plein au struct que les deux variables étaient.

typedef struct node 
{ 
    node *childrenPTR[MAX_CHILDREN_ROOT]; 
    int depth; //Distance from root to node 
    char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH]; 
    NODETYPE nodeType; 
    int numberOfChildren; 
    int numberOfKeys; 
    node *parentPTR; 
} nodeT; 

Nous pouvons voir dans l'ordre des variables dans la structure qui nodeType suit clé. Je crois que C allouera la mémoire dans le même ordre. Donc je pourrais aussi regarder ici pour identifier le problème.

+0

Il semble que votre chaîne déborde de son tampon. – cdhowie

Répondre

4

Vous copiez une chaîne trop longue dans la clé [] quelque part. Il déborde dans nodeType.

Puisque j'imagine que vous êtes nouveau dans ce domaine, je le recoderais pour vous aider à mieux comprendre ce qui se passe. Peut-être quelque chose comme:

for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++) 
{ 
    char *dest = b->tempNode->key[b->tempNode->numberOfKeys - i]; 
    char *source = b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)]; 
    strcpy(dest, source); 
} 

marche que grâce à un débogueur et source sera probablement plus long que (avec la terminaison null - vous êtes nul de fin de vos chaînes droite?) MAX_KEY_LENGTH quelque part dans votre tableau. Il pourrait même être quelque chose de fou, même pas dans votre tableau. Décomposer en quelque chose de plus petit et plus facile à déboguer dans les étapes discrètes.

+0

Merci pour l'aide, j'ai oublié parfois de simples problèmes de prise de vue en les décomposant plus loin en passant par le même débogage plus facile. – MykC

1

C'est exactement ce qui se passe si vous utilisez une fonction str *, qui attend une chaîne terminée par un caractère nul, sur quelque chose qui n'est pas une chaîne terminée par un caractère nul. Ou si la chose que vous copiez n'est pas assez grande pour la chose que vous copiez dedans.