Domanda

Sto avendo un problema quando viene eseguito gratuitamente (posizione).

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

Il messaggio di errore completo che ricevo da VS2010 è MUCCHIO CORRUZIONE rilevato: dopo il blocco normale (# 64) a 0x00031390. CRT ha rilevato che l'applicazione ha scritto alla memoria dopo la fine del mucchio.

Il debugger dice che il problema si verifica mentre 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 }

Ho provato a impostare la stessa situazione con meno roba in corso per vedere se riuscivo a circoscrivere il problema.

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

Questa è la stessa cosa come sopra, senza il ciclo for e while. Questo funziona. Rimozione del ciclo for è ciò che ha reso il lavoro. Non so perché. Alzai gli occhi ciò che il tubo catodico era ma era tutto abbastanza nuovi concetti per me e presumo che posso risolvere questo problema senza conoscere queste CRT.

I per assegna ciclo valori per la memoria allocata per la posizione, al di là che non riesco a pensare a perché questo causa un problema .... in realtà, ora che ci penso. Ho cambiato il ciclo per essere altezza + 1 che ha risolto il problema.

È stato utile?

Soluzione

Dovrebbe essere:

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

o

position = malloc(hieght * sizeof *position);

E 'comportamento non definito il modo in cui lo avete. Probabilmente stai ricevendo solo fortunato perché int e int* hanno le stesse dimensioni.

E il tipico modo corretto di scrivere il ciclo è:

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

È inoltre possibile utilizzare calloc qui:

position = calloc(hieght, sizeof *position);

e la memoria verrà azzerato per voi, quindi non c'è bisogno di loop.

Inoltre, se questo è davvero C, il cast è superfluo.

Altri suggerimenti

Credo che il problema nel ciclo è il <=, che in realtà dovrebbe essere <. Di conseguenza, il ciclo va tempo di un giro di troppo e corrompe l'elemento successivo sul mucchio!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top