PDA

Visualizza la versione completa : [C] Anomalia in codice che utilizza realloc()


Celebron
08-01-2011, 15:55
Ok c'è qualcosa che non va in una parte del codice che posto:


ALexception extendArray(arraylist_t* al, int dim){

int i;
item_t** tarray;

//general check
if(al == NULL){
printf("arraylisy not initialized or null\n");
return ALParametersError;
}

//realloc

tarray = (item_t**) realloc(al->array, al->size+dim);

if(tarray == NULL){
printf("error, memory full");
return ALMemoryError;
}
else{ //refresh and initialization
al->array = tarray;
al->size = al->size + dim;

for(i = al->size - dim; i< al->size; i++){
al->array[i] = returnVoidElement();
}

}
return ALSuccess;
}

la riga incriminata è quella della realloc
allora faccio qualche premessa. Si tratta di una funzione in uso in una libreria particolare che ho creato così per comodità. Semplicemente gestisce un mio tipo di array.

la struct di base è:

struct arraylist{
item_t** array;
int size;
};

L'extendArray serve per aumentare la dimensione dell'array nel caso io abbia richiesto un inserimento di un valore in una posizione che fuoriesce dalla size attuale dell'array (in teoria sarebbe una static, ma sto ancora decidendo se renderla disponibile al client nel caso voglia estendere l'array per altri motivi)

Fondamentalmente il mio array, col mio programma di test, al momento della chiamata è formato da tre item_t* creati da me nel main che sono inseriti in posizione 0-1-2.
Tutte le altre posizioni sono occupate da VUOTO che è un particolare item_t* gestito dalla mia libreria item.h, comunque non è che importi ora.

Quando chiamo la realloc succede qualcosa di strano °_°. Sin poco prima controllando con il debugger effettivamente tutte le posizioni dell'array sono settate a valore VUOTO, tranne 0-1-2 che appunto sono quelle in cui tramite il main ho inserito i miei oggetti
subito dopo la realloc però, sia in tarray sia in al->array il valore in posizione 3 cambia improvvisamente, senza motivo, settandosi ad un altro indirizzo che risulta non leggibile (infatti se chiamo la funzione che stampa tutto l'array, mi da un segmentation failure e anche gdb mi segnala sin subito dopo l'esecuzione della realloc che la posizione al->array[3] risulta non leggibile mentre tutte le altre sono effettivamente uguali al valore che avevano in precedenza, come dovrebbe essere)
Ora, che diavolo c'è di sbagliato? A che si deve questo comportamento?

Celebron
08-01-2011, 16:06
Oh God, che errore noob -_- scusate stavo dormendo probabilmente

mi son dimenticato di inserire nella realloc il * (sizeof(item_t*))
-_- figo il fatto che ci si renda conto dell'errore esattamente 5 secondi dopo aver postato sul forum

risolto

shodan
08-01-2011, 16:20
Giusto per curiosità: quel item_t** rappresenta una matrice? E quello che contiene è allocato dinamicamente?

Celebron
08-01-2011, 16:24
no, è un vettore di item_t*
ogni item_t* è allocato dinamicamente

ramy89
08-01-2011, 18:47
Che libreria usi per dichiarare un item_t ?
Io su c++ reference ho trovato solo time_t.

shodan
08-01-2011, 18:51
Te lo crei no?
typedef qualcosa item_t

ramy89
08-01-2011, 19:03
Si ma in C il bool alla fine contiene un byte,in cpp come si fa a creare un elemento di 1 bit?

shodan
08-01-2011, 19:15
Ma dove lo vedi l'elemento da un bit? :confused:

ramy89
08-01-2011, 19:31
Ah si scusa,ho capito.
Praticamente usi item_t per dichiarare la struttura,ho capito adesso.
Pensavo lo usassi per crearti un tipo nuovo con memoria diversa.

Celebron
09-01-2011, 02:48
si item_t come ho detto è gestito da un altra libreria item.h

per la precisione nel punto h c'è solo
typedef struct item item_t

mentre nel .c
struct item{
int key;
int value;
char* definition;
};

ma come già avevo specificato, era irrilevante

Loading