Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C]Chiarimento su array

    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)) ?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    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....?

  4. #4
    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
    codice:
    *(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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    *(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?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.