[C] Curioso comportamento della malloc e puntatori raminghi
Inviato: sab 12 lug 2008, 12:28
L'altra notte mi stavo divertendo a implementare un semplice stack (LIFO data structure), giusto per staccare dalla monotonia dello studio
, e sono inciampato in due particolari problemi.
Allora, intanzo il codice incriminato è il seguente:
(perdonate il collage, però ho il codice distribuito in più file, ho copiato solo lo stretto indispensabile).
Il primo problema è questo: la malloc mi alloca me**a (e fin qui ok) e il memset non funziona. Eclipse mi dice che, prima dell'allocazione, nelle 15 locazioni di memoria successive al puntatore int* S.stack vi è:
e subito dopo l'allocazione la stessa stringa diventa
Quel numero è RICORRENTE, sempre e comunque. Anche se uso la calloc, quella commentata, me lo ritrovo, solo che lo ritrovo all'undicesima posizione, e essendo STACK_LENGTH = 10 il programma "funzionerebbe" anche - ma mi rifiuto di accettare quella soluzione lol. Il memset successivo non serve a nulla. Se modifico con l'IDE il valore va benissimo, lo cambia e ciccia, però non capisco da dove arrivi. NON ho ancora provato a compilare su Win, mi pesa il c**o farlo bootare
.
Ok, secondo problema, molto più grave a livello funzionale, non tiene conto dell'incremento del puntatore nella push. E' un puntatore perché volevo provare una soluzione alternativa al solito uso di un indice che viene incrementato, volevo usare un puntatore allocato inizialmente all'indirizzo della prima cella di memoria del vettore e poi incrementarlo mano a mano. Funzionare funziona, noto che l'indirizzo viene incrementato correttamente durante la push, ma al ritorno al main e alla successiva chiamata di push (è in un loop che va da 0 a STACK_LENGTH) viene resettato all'indirizzo originale :dunno:.
Qualche idea su dove andare a guardare per risolvere queste cose?
Allora, intanzo il codice incriminato è il seguente:
Codice: Seleziona tutto
typedef struct stack_{
int* stack;
int* top;
} stack;
[...]
const int STACK_LENGTH = 10;
int main(int argc, char** argv) {
stack S;
S = stack_init(S);
[...]
extern const int STACK_LENGTH;
stack stack_init(stack S) {
//S.stack = calloc(STACK_LENGTH, sizeof(int));
if ((S.stack = (int*) malloc(STACK_LENGTH)) == NULL) {
fprintf(stdout, "Error while allocating stack.\n");
} else {
memset(S.stack, 0, STACK_LENGTH);
S.top = S.stack;
}
return(S);
}
[...]
void push(stack S, int x) {
if(!stack_full(S)) {
*(S.top) = x;
(S.top)++;
} else {
fprintf(stdout, "Stack overflow avoided - value discarded.\n");
}
return;
}Il primo problema è questo: la malloc mi alloca me**a (e fin qui ok) e il memset non funziona. Eclipse mi dice che, prima dell'allocazione, nelle 15 locazioni di memoria successive al puntatore int* S.stack vi è:
Codice: Seleziona tutto
{-1075572456, -1210256496, 2, -1075572412, -1075572400, -1208863784, 0, 1, 0, 134513245, -1209004044, -1208742688, 0, -1075572456, -601784191}
Codice: Seleziona tutto
{0, 0, 0, 135153, 0 <repeats 11 times>}
Ok, secondo problema, molto più grave a livello funzionale, non tiene conto dell'incremento del puntatore nella push. E' un puntatore perché volevo provare una soluzione alternativa al solito uso di un indice che viene incrementato, volevo usare un puntatore allocato inizialmente all'indirizzo della prima cella di memoria del vettore e poi incrementarlo mano a mano. Funzionare funziona, noto che l'indirizzo viene incrementato correttamente durante la push, ma al ritorno al main e alla successiva chiamata di push (è in un loop che va da 0 a STACK_LENGTH) viene resettato all'indirizzo originale :dunno:.
Qualche idea su dove andare a guardare per risolvere queste cose?