Usando malloc e la connessione in C / C ++ e ottenere errore MUCCHIO CORRUZIONE RILEVATO
-
28-09-2019 - |
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.
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!