• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Dubbio sui puntatori, semplice questione.

devilpazzo

Nuovo utente
Autore del topic
7 Dicembre 2010
37
0
Miglior risposta
0
Creo questa discussione, con l’intento di riuscire a colmare un mio dubbio sull’uso dei puntatori, in particolare sull’allocazione della memoria in modo dinamico con il mermory allocation.

Come è possibile che facendo per esempio un programmino del genere:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Riesco senza problemi a continuare a riempire questo “vettore” fino alla cella p[17] e addirittura posso mettere anche un valore nella p[200]?

Non dovrebbe invece esserci spazio solo per due interi che ho allocato dinamicamente con la malloc, la quale ha restituito l’indirizzo del primo blocco contiguo di byte allocando (ovvero riservando spazio in memoria) due interi, cioè 8 byte di RAM ?

Nella mia testa, potrebbero essere utilizzati SOLTANTO p[0], che corrisponde a *p e p[1] che sarebbe il primo intero del primo blocco di RAM, e p[2], che sarebbe il secondo blocco di RAM corrispondete appunto al secondo intero.

Ma nella pratica purtroppo non è così, perché riesco ad utilizzare anche altre caselle di questa sorta di vettore-puntatore.

Quindi, come è possibile tutto questo? E in realtà cosa sono questi p[1],p[2],p[3] etc? Il codice viene compilato senza dare alcun problema, e la cosa mi preoccupa abbastanza. Grazie per la cortese attenzione.
 
@devilpazzo

allora ... il programma durante l'esecuzione si blocca nel cercare di puntare ad un area di memoria inesistente.
questa assegnazione è impossibile :
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
così come i due cicli sotto , il semplice fatto che non segnali errore è perché sintatticamente è corretto , ma non logicamente ,il compilatore non controlla quanta memoria stai allocando , appunto è una cosa dinamica che avviene durante l'esecuzione. in totale puoi arrivare fino a 2 elementi in quel modo.

ricorda sempre di chiamare free al termine delle operazioni
 
Ultima modifica:
Oh! Era proprio quello che volevo leggere ! Quindi ho spazio solo per 8 interi? Ma in realtà non dovrebbero essere due?

p= (int *) malloc(2*sizeof(int));

Cioè io chiedo di riservare 2 blocchi contigui di memoria per due interi alla malloc, lei mi dice OK, ci stanno, mi restituisce l’indirizzo del primo blocco al puntatore e mi riserva 8 byte nella RAM, ma poi in realtà posso salvarmi fino a 8 numeri interi? Come è possibile,non dovrebbero occupare 8*sizeof(int)?

Da come scrivi tu, sarebbe 1 byte per ogni intero? Non occupa 4 byte un intero?!:O

Dovrei avere accesso solo a queste aree con la dichiarazione della malloc che ho fatto:

p[0] sarebbe il primo oggetto puntato *p
p[1] primi quattro Byte per il primo numero
p[2] secondi quattro Byte per il secondo numero

E invece nella pratica non è così… Cosa non ho capito?
 
@devilpazzo

scusa ho detto otto , errore nello scrivere comunque sono due :emoji_slight_smile: , è matematica se occupa 4 byte un int e ne allochi per due non puoi metterne di più ;)

n.b puoi anche scrivere così se vuoi :

*(p+0)=4;
quando usi malloc o calloc è buona abitudine controllare se c'è memoria disponibile
 
Finalmente qualcuno che mi ha levato questo macigno dalla testa! Ti ringrazio all'infinito, ti ho anche aggiunto su Skype. Alla fine quindi il problema era che il compilatore non segnava questo errore sintattico, ma l'errore era di logica, e io che mi ero spaventato pensando chissà cosa.
 
Finalmente qualcuno che mi ha levato questo macigno dalla testa! Ti ringrazio all'infinito, ti ho anche aggiunto su Skype. Alla fine quindi il problema era che il compilatore non segnava questo errore sintattico, ma l'errore era di logica, e io che mi ero spaventato pensando chissà cosa.

Penso che il tuo dubbio possa considerarsi come risolto, mi permetto di spostare. :emoji_slight_smile: