PDA

Visualizza la versione completa : [C]Chiarimento su array


darth fener
04-02-2009, 20:24
Salve a tutti. Mi è venuto un dubbio sugli array, faccio un esempio:
#define dmax 100;
int i=0,v[dmax];
Io so che il valore i-esimo dell'array ci si può arrivare facendo *(v+i). Teoricamente all'indirizzo di memoria di v[0] viene sommato il valore di i moltiplicato per il tipo di v. Ma allora non dovrebbe essere: *(v+(sizeof(int)*i)) ?

oregon
04-02-2009, 20:33
L' "aritmetica dei puntatori" e' implementata dal compilatore C in maniera automatica.

http://it.wikipedia.org/wiki/Aritmetica_dei_puntatori

Quando trasforma la riga *(v+i) il compilatore provvede a creare tutte le istruzioni che servono per puntare all'elemento corretto.

darth fener
04-02-2009, 22:58
Ma questo vale solo per i vettori giusto?
Se io ho una variabile int b=3; e un'altra int *a;
gli dico a=&b; poi se voglio mettere un valore nella locazione di memoria successiva ad a faccio
*(a+(1*sizeof(int)))=4;
*(a+(2*sizeof(int)))=5;
giusto? così alla fine non mi sono realizzato indirettamente un array?
PS: posso assegnare un indirizzo di memoria libero manualmente ad un puntatore, tipo a=0xFF....?

MItaly
04-02-2009, 23:29
Originariamente inviato da darth fener
Ma questo vale solo per i vettori giusto?
Se io ho una variabile int b=3; e un'altra int *a;
gli dico a=&b; poi se voglio mettere un valore nella locazione di memoria successiva ad a faccio
*(a+(1*sizeof(int)))=4;
*(a+(2*sizeof(int)))=5;

Semmai


*(a+1)=4;
*(a+2)=5;
, visto che il compilatore considera già le dimensioni della variabile.


giusto? così alla fine non mi sono realizzato indirettamente un array?

No, in questa maniera stai assegnando valori a memoria non inizializzata o riservata ad altri scopi, il che è un ottimo modo per ottenere errori strani e mandare in crash il programma.


PS: posso assegnare un indirizzo di memoria libero manualmente ad un puntatore, tipo a=0xFF....?
È una cosa che puoi scrivere e compilare, ma che probabilmente ti conduce ad un segmentation fault. Su praticamente tutte le macchine moderne non puoi accedere alla memoria come ti pare, è il sistema operativo che gestisce la memoria e la alloca su richiesta dei programmi; a questo proposito il C fornisce le funzioni malloc, calloc, realloc e free.

oregon
04-02-2009, 23:35
Originariamente inviato da darth fener
Ma questo vale solo per i vettori giusto?

No ... vale per i puntatori ... (non a caso si chiama "aritmetica dei puntatori" ...)


Se io ho una variabile int b=3; e un'altra int *a;
gli dico a=&b; poi se voglio mettere un valore nella locazione di memoria successiva ...

NON ESISTE una locazione successiva ... accedi a memoria non allocata o sporchi quella riservata ad altro ...


giusto? così alla fine non mi sono realizzato indirettamente un array?

Sbagliato ... l'array deve essere ALLOCATO ...


PS: posso assegnare un indirizzo di memoria libero manualmente ad un puntatore, tipo a=0xFF....?

No (vedi cosa ti ha detto MItaly) ... e aggiungo ... a cosa servirebbe?

darth fener
04-02-2009, 23:36
*(a+1)=4;
*(a+2)=5;
Se faccio così il programma mi va in crash. La conversione automatica non la fa solo quando sa che è un vettore?

oregon
04-02-2009, 23:39
Originariamente inviato da darth fener
*(a+1)=4;
*(a+2)=5;
Se faccio così il programma mi va in crash. La conversione automatica non la fa solo quando sa che è un vettore?

Non hai letto bene quello che ti e' stato risposto ...

Quando vai a scrivere un valore tramite un puntatore, la memoria in cui arrivi a scrivere DEVE ESSERE STATA ALLOCATA in precedenza. Altrimenti (come nel tuo esempio) vai a scrivere dove non devi.

Un vettore e' fatto da una serie di zone di memoria adiacenti TUTTE ALLOCATE in cui puoi scrivere ...

Loading