View Full Version : [C] allocazione di memoria...
lupoxxx87
09-06-2010, 16:14
buongiorno a tutti...
vorrei porre una domanda particolare ai guru del C
(ps: fero86 non dire che è un thread inutile perchè il C ti fa pena xD)
riuscite a spiegarmi perchè un allocazione di memoria siffatta mi dia segmentation fault ?
#include <stdio.h>
#include <stdlib.h>
void crea (int *vettore, int dim) {
vettore = calloc (dim, sizeof(int));
vettore[3] = 5;
}
int main() {
int i, dim = 5;
int *vettore = NULL;
crea (vettore, dim);
for (i = 0; i < 5; i++) {
printf ("elemento %d: %d\n", i, vettore[i]);
}
}
dite che dovrei mettere un this.vettore all'interno di crea ? xD xD
lupoxxx87
09-06-2010, 16:39
mi autorispondo:
a chi potesse interessare....
nella chiamata di funzione, viene creata una copia locale del valore del puntatore, ovvero viene creata una variabile locale nel record di attivazione che punta alla stessa area di memoria.
quindi la soluzione che stavo cercando dovrebbe essere
#include <stdio.h>
#include <stdlib.h>
void crea (int **vettore, int dim) {
*vettore = calloc (dim, sizeof(int));
(*vettore)[3] = 5;
}
int main() {
int i, dim = 5;
int *vettore = NULL;
crea (&vettore, dim);
for (i = 0; i < 5; i++) {
printf ("elemento %d: %d\n", i, vettore[i]);
}
}
Teo@Unix
09-06-2010, 17:26
a chi potesse interessare....
traduzione passaggio puntatore:
0x0804843f <main+27>: mov %eax,0x4(%esp)
0x08048443 <main+31>: lea -0x10(%ebp),%eax << ----
0x08048446 <main+34>: mov %eax,(%esp)
0x08048449 <main+37>: call 0x80483f4 <crea>
traduzione passaggio della copia:
0x08048439 <main+27>: mov %eax,0x4(%esp)
0x0804843d <main+31>: mov -0x10(%ebp),%eax << ----
0x08048440 <main+34>: mov %eax,(%esp)
0x08048443 <main+37>: call 0x80483f4 <crea>
L'indirizzo è univoco. Pertanto SIGSEGV è corretto.
Quindi se non sbaglio lea non sposta l'indirizzo ma l'effettivo contenuto, ovvero l'indirizzo di 'vettore'.
C is powerful!
grazie, lupoxxx87
DanieleC88
10-06-2010, 00:00
(ps: fero86 non dire che è un thread inutile perchè il C ti fa pena xD)
OMG ha creato una fobia! :D
Comunque, la tua autorisposta è corretta, ma ricorda di fare una free() per ogni allocazione...
DanieleC88
10-06-2010, 00:06
Quindi se non sbaglio lea non sposta l'indirizzo ma l'effettivo contenuto, ovvero l'indirizzo di 'vettore'.
Per l'esattezza fa il contrario, cioè invece di spostare il contenuto sposta l'indirizzo (il contenuto è un int *, l'indirizzo sarà un int **).
ciao ;)
Teo@Unix
10-06-2010, 14:05
Per l'esattezza fa il contrario, cioè invece di spostare il contenuto sposta l'indirizzo (il contenuto è un int *, l'indirizzo sarà un int **).
ciao ;)
si, scusa ho confuso.... :rolleyes:
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.