Domanda

Ho un problema con la funzione realloc in C. Ti sto passando un codice sotto:

typedef struct _Pool Pool;
typedef struct _Item Item;

struct _Pool {
    Item ** items;
    unsigned int itemsCount;
    unsigned int poolSize;
    unsigned int poolStep;
};

struct _Item {
    char * file; 
    unsigned int lenOfFilePath;
    unsigned int x;
};

void Pool_insert(Pool ** pool, Item * item)
{       
    if ((*pool)->itemsCount + 1 == (*pool)->poolSize)
    {
        (*pool)->items = realloc((*pool)->items, sizeof(Item *)*((*pool)->poolSize + (*pool)->poolStep));;
        if (!(*pool)->items) return;
        (*pool)->poolSize += (*pool)->poolStep;
    }

    (*pool)->items[(*pool)->itemsCount++] = item;
}

Non sto inviando il primo codice di allocazione, ma se io aumento il numero di elementi che sto usando lì tutto funziona bene. Quando chiamo realloc sto ottenendo tale errore:

  

malloc: *** errore per oggetto 0x19dba8:   puntatore viene riallocato non era   allocato

La prego di aiutarmi a risolvere il mio problema?


Ecco il metodo di creazione per la piscina:

void Pool_create(Pool ** pool, unsigned int poolSize)
{   
    unsigned int poolMemSize = sizeof(Pool) + sizeof(Item *)*poolSize;
    *pool = malloc(poolMemSize);
    if (!*pool) return;
    memset(*pool,0,poolMemSize);

    (*pool)->itemsCount = 0;
    (*pool)->poolSize = poolSize;
    (*pool)->poolStep = POOL_STEP;

    (*pool)->items = (Item **)((char*)(*pool) + sizeof(Pool));
    if(!(*pool)->items) return;
    memset((*pool)->items, 0, sizeof(Item *) * poolSize);
}

Come ho detto, se voglio ad esempio inserire 1000 articoli e allocare la memoria per creare la funzione, allora tutto funziona bene se dichiaro iniziare dimensione del pool per 100 elementi e poi voglio realloc Articoli ottengo l'errore.

La ringrazio molto per tale risposta rapida.

È stato utile?

Soluzione

Ma (*pool)->items non è mai stato assegnato! Hai solo assegnato (*pool) - l'intera fetta di memoria. Si dovrebbe avere usato due mallocs in questo caso - una per la struttura di controllo (Pool) e uno per gli oggetti * array.

Precisazione: non si può realloc parte di memoria allocata - solo il pezzo intero malloc'ed. Si noti inoltre che è opportuno verificare il risultato di realloc prima, prima di sostituire il puntatore originale in codice ben scritto -. altrimenti se realloc non si perde il blocco di memoria precedentemente allocato

Altri suggerimenti

struct _Pool {
    Item ** items;
    unsigned int itemsCount;
    unsigned int poolSize;
    unsigned int poolStep;
};
  

malloc: *** errore per oggetto 0x19dba8:   puntatore viene riallocato non era   allocato

Stai allocazione di memoria per gli elementi con malloc? Quel messaggio sembra dire che non sei. Realloc deve essere usato per la memoria allocata con malloc -. Come funzioni

(*pool)->items = realloc((*pool)->items, sizeof(Item *)*((*pool)->poolSize + (*pool)->poolStep));;

Per ulteriore assistenza, ci mostrano come si inizializza oggetti.

Probabilmente si è dimenticato di inizializzare gli elementi * nella struttura e sono a caccia di un puntatore selvaggio.

Ecco il metodo di creazione per la piscina:

void Pool_create(Pool ** pool, unsigned int poolSize)
{   
    unsigned int poolMemSize = sizeof(Pool) + sizeof(Item *)*poolSize;
    *pool = malloc(poolMemSize);
    if (!*pool) return;
    memset(*pool,0,poolMemSize);

    (*pool)->itemsCount = 0;
    (*pool)->poolSize = poolSize;
    (*pool)->poolStep = POOL_STEP;

    (*pool)->items = (Item **)((char*)(*pool) + sizeof(Pool));
    if(!(*pool)->items) return;
    memset((*pool)->items, 0, sizeof(Item *) * poolSize);
}

Come ho detto, se voglio ad esempio inserire 1000 articoli e allocare la memoria per creare la funzione, allora tutto funziona bene se dichiaro iniziare dimensione del pool per 100 elementi e poi voglio realloc Articoli ottengo l'errore.

La ringrazio molto per tale risposta rapida.

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