Frage

ich habe ein Problem, wenn sie frei (Position) ausgeführt wird.

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;
}

Die vollständige Fehlermeldung, die ich von VS2010 erhalten ist Heapbeschädigung GEFUNDEN: nach Normalblock (# 64) auf 0x00031390. CRT festgestellt, dass die Anwendung in dem Speicher nach Ende des Heap geschrieben.

Der Debugger sagt, das Problem tritt auf, während bei in: 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 }

Ich habe versucht, die Einrichtung die gleiche Situation mit weniger Sachen los, um zu sehen, ob ich das Problem eingrenzen könnte.

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

Dies ist das gleiche wie oben, ohne die for-Schleife und While-Schleife. Das funktioniert. die for-Schleife zu entfernen ist, was machte es funktionieren. Ich weiß nicht, warum. Ich schaute nach oben, was die CRT war aber es war alles ziemlich neue Konzepte zu mir und ich nehme an, dass ich dieses Problem ohne zu wissen, über diese CRTs lösen kann.

Die for-Schleife Abtretungs Werte in dem Speicher für die Position zugeordnet ist, über das ich nicht denken kann, warum dies ein Problem verursacht .... eigentlich jetzt, dass ich darüber nachdenke. I die Schleife verändert Höhe + 1 sein, die das Problem behoben.

War es hilfreich?

Lösung

Es sollte sein:

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

oder:

position = malloc(hieght * sizeof *position);

Es ist nicht definiertes Verhalten so, wie Sie es haben. Du bist wahrscheinlich nur Glück bekommen, weil int und int* gleich groß sind.

Und der typische richtige Weg, um die Schleife zu schreiben ist:

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

Sie können auch calloc verwenden hier:

position = calloc(hieght, sizeof *position);

und der Speicher wird für Dich auf Null gesetzt werden, so dass Sie eine Schleife nicht haben.

Auch wenn diese wirklich C ist, die Besetzung ist überflüssig.

Andere Tipps

Ich denke, das Problem in der Schleife ist die <= das eigentlich sein sollte <. Folglich wird die Schleife zu rund einer Zeit vergeht viele und verdirbt den nächsten Punkt auf dem Heap!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top