Question

J'ai un problème quand il est libre (position) est exécutée.

void printTree(nodeT node, int hieght)
{
    int *position;
    position = (int*)malloc(hieght * sizeof(int*));
    for (int i = 0; i <= hieght; i++)
    {
        position[i] = 0;
    }
    BOOLEAN DONE = FALSE;
    while (DONE == FALSE)
    {
        printMoveDown(&node, position);
        printLEAFNode(&node, position);
        DONE = printMoveUp(&node, position);
        printSingleKey(&node, position);
    } 
    free(position);
    position = NULL;
}

Le message d'erreur complet que je reçois de VS2010 est CORRUPTION HEAP DECOUVERT: après bloc normal (# 64) à 0x00031390. CRT a détecté que l'application écrit dans la mémoire après la fin du segment.

Le débogueur dit que le problème se produit tout en: dbgheap.c

extern "C" void __cdecl _free_dbg_nolock
line 1376:  if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
                if (pHead->szFileName) {..}
                else { this is where the program stops }

J'ai essayé la mise en place de la même situation avec moins de choses en cours pour voir si je pouvais réduire le problème vers le bas.

void function (int y)
{
    int *x;
    x = (int*)malloc(y * sizeof(int*));
    free(x);
    x = NULL;
}

Ceci est la même chose que ci-dessus sans la boucle et en boucle. Cela marche. Retrait de la boucle est ce qui a fait fonctionner. Je ne sais pas pourquoi. Je levai les yeux ce que le CRT était, mais il était pour moi tous les concepts assez nouveaux et je suppose que je peux résoudre ce problème sans savoir au sujet de ces tubes cathodiques.

Les pour cessionnaires en boucle des valeurs à la mémoire allouée pour la position, au-delà que je ne peux pas penser pourquoi cela pose un problème .... en fait maintenant que je pense à ce sujet. Je changé la boucle pour être hauteur + 1 qui a résolu le problème.

Était-ce utile?

La solution

Il devrait être:

position = malloc(hieght * sizeof(int));

ou

position = malloc(hieght * sizeof *position);

Ce comportement non défini de la façon dont vous l'avez. Vous êtes probablement trouvé la chance parce que int et int* sont de la même taille.

Et la bonne façon typique d'écrire la boucle est:

for (int i = 0; i < hieght; i++)
{
    position[i] = 0;
}

Vous pouvez également utiliser calloc ici:

position = calloc(hieght, sizeof *position);

et la mémoire sera remis à zéro pour vous, afin que vous n'avez pas à boucle.

En outre, si cela est vraiment C, la distribution est superflue.

Autres conseils

Je pense que le problème dans la boucle est le <= qui devrait vraiment être <. Par conséquent, la boucle fait le tour une fois de trop et corrompt l'élément suivant sur le tas!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top