Newsgroup: it.comp.lang.c
Titolo: domanda: memoria, puntatori e altro :)

Chiedo scusa ma non sapevo proprio come intitolare questo messaggio. Vengo
subito al punto:
Come posso far puntare un puntatore ad un indirizzo di memoria preciso?
Ad esempio all'indirizzo 2354324?
Come posso creare una variabile ad esempio int v di valore 5, e fare in modo
che a questa sia assegnato l'indirizzo x, che scelgo io arbitrarialmente?
Grazie, saluti

 ... ...
  Non puoi... :-(
E' il sistema operativo che ti assegna l'area di memoria... E se scrivi dove
non potresti, ti becchi un "segmentation fault", col bel "core file" di
contorno...
Ciao :-)

 Ad esempio all'indirizzo 2354324?
È possibile farlo con un cast, ma, a parte il fatto che non serve a niente,
provoca un comportamento indefinito.
int *x = (int*)234;
Ciao

 Ciao
non sapevo si potesse fare così, io avevo pensato ad un metodo ancora
peggiore :)
dichiaro un puntatore(int *ptr), mi faccio dare il suo indirizzo di memoria
con l'operatore & (&ptr)e quindi lo confronto con l'indirizzo che voglio
raggiungere... se questo è minore faccio ptr-- altrimenti faccio ptr++
all'interno di un ciclo for o while....tremendo & inutile :)
Ciao
Gnagno

 all'interno di un ciclo for o while....tremendo & inutile :)
In pratica fai gironzolare per la ram il cagnolino ptr senza guinzaglio e lo
lasci scacazzare negli indirizzi che gli pare a lui;-)
Ciao

 Ciao
Infatti non ho detto che è una cosa intelligente da fare.... anzi :)
E cmq non credo che quello che ho detto io possa funzionare, mi pare che
windows per esempio abbia qualcosa che avvisa se si sta sconfinando dalla
zona di memoria destinata ad un processo... (sto sbagliando?)

 wrote in message
news:wm7Ea.52947$pR3.1...@news1.tin.it...

Si puo' fare, limitatamente.
E ha perfino senso in quei casi in cui (vedi console, tipo PS2 o XBox - ma
sono sicuro anche altre macchine) l'accesso "sparso" in memoria e' per certi
versi lento, per minimizzare i cache miss della CPU ^^;
Per intenderci, se io ho una lista (lista normale, niente di che) e alloco
gli elementi "dove capita" in memoria con la malloc (dove l'OS mi da'
memoria - che non e' proprio a caso ma segue delle regole che spesso non
sono documentate), scorrere la lista e' relativamente lento.
In questi casi in cui in realta' non ti interessa che gli elementi di una
lista stiano ad un indirizzo n, ma ti interessa che il primo stia ad un
indirizzo p, il secondo a un indirizzo p+1, il terzo ad un indirizzo p + 2,
e cosi' via, c'e' un "mini-trucco", che consiste nell'allocare un blocco di
memoria (es, se prevedi che la tua lista contenga fino a 10 strutture,
allochi sizeof(struttura)*10), e poi gestirselo internamente a mano (non
allocare le singole strutture con malloc, ma chiamare una o piu' funzioni
"tue" per gestire questo/i blocco/i di memoria; queste funzioni ti
restituiscono un'area di memoria vuota da usare "come struct").
Praticamente in questo modo una lista diventa per certi versi un'array,
salvo che se te ne serve un altro pezzo (es, hai memoria per 10 elementi e
te ne servono di piu') fai una seconda malloc, e la gestisci di nuovo nello
stesso modo. Ci saranno probabilmente ancora cache miss, se fai delle
"giunte" alle liste in questo modo, ma cmq molti (veramente molti) di meno
(nell'esempio, potenzialmente si riducono fino ad essere un decimo delle
originali).
In questo modo puoi decidere l'indirizzo di memoria in cui mettere un dato,
*limitatamente* all'area di memoria allocata con la malloc.
Non mi viene in mente nient'altro, a riguardo^^

 ha scritto nel messaggio
news:NCKEa.59669$pR3.1...@news1.tin.it...

Si, in teoria tutti gli OS hanno dei meccanismi che bloccano il programma
prima che faccia casino, ma in generale scrivere in aree non consentite è
undefined behaviour, e quindi non è detto che non succeda una catastrofe.
Ciao