Visualizzazione dei risultati da 1 a 10 su 18

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Quote Originariamente inviata da BoG Visualizza il messaggio
    Ciao a tutti, ho una domanda da fare:
    Dato il codice:
    codice:
    using namespace std;
    #include <iostream>
    void cambia(int m, int n[7]){
        for(int i=0;i<7;i++) 
            cout << "n["<<i<<"]: " << n[i] <<endl;
            (*(n+m))--;
            m++;
            n--;
    }
    
    
    int main(){
        int vet[] ={4,2,3,2,4};
        cambia(vet[4], vet-1);
        cambia(0,&vet[4]);
        int i=0;
        for(i=0; i<5; i++)
            cout << vet[i];
        return 0;
        
    }
    faccendolo eseguire, noto che
    codice:
    vet[-1]=0
    ..?? non dovrebbe esserci memoria sporca?

    Tanto per darvi un idea: eseguendo il codice ho l'output:

    codice:
    bog@bog-desktop:~$ ./a.out n[0]: 0
    n[1]: 4
    n[2]: 2
    n[3]: 3
    n[4]: 2
    n[5]: 4
    n[6]: 32767
    n[0]: 4
    n[1]: 32767
    n[2]: 0
    n[3]: 0
    n[4]: 0
    n[5]: 0
    n[6]: -1924407835
    42313
    Dove dici vet[-1]? Non c'è nessun accesso alla locazione -1, ed un accesso simile provocherebbe sicuramente un errore di compilazione. Quel "vet-1" passa praticamente un indirizzo di memoria (quello di vet) sottraendo però -1.
    Ad esempio l'indirizzo di vet è: 0x28fef8
    Se passo vet-1 ottengo: 0x28fef4
    Se passo vet+1 ottengo: 0x28fefc

    Il primo valore che viene stampato è causato proprio da questo infatti.

    Poi vorrei fare un altra domanda:
    come potete vedere, nell'esercizio, passo un vettore di dimensione 5 ad un vettore di dimensione 7. Ok, immagino che compilera' i 5 campi con i valori passatigli e gli altri rimaranno memoria sporca. Ma se io passassi il mio vettore di 5 elementi ad uno di 2? i primi 2 come funzionerebbe?


    In realta', io so che vet[] non è altro che un puntatore al primo elemento dei valori inseritivi. quindi ... che io passi il mio vettore di 5 elementi ad un vettore di 10 o solo 1 ... non fa differenza, no ?
    se io so che dentro ci sono 5 elementi, io posso scrivere vettore[5] anche se il vettre è stato dichiarato ti dimensione 1. Giusto?

    GRazie a tutti
    Il problema è che rischi (anzi, non è un rischio, è una certezza) di sovrascrivere altro in memoria. Se tu hai memoria per 2 elementi e gli vai a passare l'indirizzo di un array con 5, tu puoi accedere tramite quell'array agli elementi di quello con 5 (avendo lo stesso indirizzo). Ma prima avevi riservato due posti in memoria, quindi rischi di andare a sovrascrivere i dati che ci sono dopo ai due elementi allocati con 3 aggiuntivi quindi.

    E' un riscontro che puoi avere anche sul tuo codice quello riguardante gli accessi:
    codice:
    using namespace std;
    #include <iostream>
    void cambia(int m, int n[2]){
        for(int i=0;i<5;i++) 
            cout << "n["<<i<<"]: " << n[i] <<endl;
         cout << "Indirizzo n "<< n;
    }
    
    
    int main(){
        int vet[] ={4,2,3,2,4};
        cambia(vet[4], vet);
        cout << "\nIndirizzo vet: "<<vet;
        return 0;
    
    }
    Output:
    codice:
    n[0]: 4
    n[1]: 2
    n[2]: 3
    n[3]: 2
    n[4]: 4
    Indirizzo n 0x28fefc
    Indirizzo vet: 0x28fefc

    Quindi di fatto sullo stack la differenza c'è...
    Ad ogni modo non mi sembra una pratica "necessaria" questa.


    PS: non so se mi sono espresso correttamente, al massimo riformulo.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    48
    Quote Originariamente inviata da Patrick Jane Visualizza il messaggio
    Dove dici vet[-1]? Non c'è nessun accesso alla locazione -1, ed un accesso simile provocherebbe sicuramente un errore di compilazione. Quel "vet-1" passa praticamente un indirizzo di memoria (quello di vet) sottraendo però -1.
    Ad esempio l'indirizzo di vet è: 0x28fef8
    vorrei chiedetri: perchè allora vet-1 mi da n[0]=0?
    BoG

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da BoG Visualizza il messaggio
    vorrei chiedetri: perchè allora vet-1 mi da n[0]=0?
    Che vuoi dire?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    48
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Che vuoi dire?
    Intendo dire:
    quando chiamo la mia funzione
    codice:
    cambia(vet[4], vet-1);
    , quel
    codice:
    vet-1
    è un puntatore (perche' vet e' stato dichiarato array) alla cella di memoria (della dimensione di un intero, 4byte) prevedente l'inizio del vettore


    4 4 2 3 2
    vet[0] vet[1] vet[2] vet[3] vet[4]


    Mentre, una volta passato vet-1 a n[7] ho:

    mem.sporca 4 4 2 3 2
    n[0] n[1] n[2] n[3] n[4] n[5]

    perchè n[0] contiene sempre 0 ?
    BoG

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da BoG Visualizza il messaggio
    vorrei chiedetri: perchè allora vet-1 mi da n[0]=0?
    Se accedi un indirizzo di memoria a caso leggendo un intero la probabilità che ci sia uno 0 è 1/(2^32) (supponendo che la dimensione di int sul tuo compuret sia 4 bytes)
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.