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

    [C] problema sui puntatori

    Ciao!
    Ho un piccolo problema, ve lo scrivo con un tratto di codice
    codice:
            /* Struttura */
    typedef struct lezioni lessons;
    
    struct lezioni{
        int num;
        lessons *next;
        };
    
            /* Prototipi */
    lessons *getfile(lessons *les, int **vet);
    int *studentsalloc(int nstudents);
    
    
    int main (void){
        int *vet; //un vettore che voglio allocare dinamicamente
        lessons *les;
        les = getfile(les, &vet);
        return 0; 
    }
    
    lessons *getfile(lessons *les, int **vet){
        FILE *fo; //file open
        char name[M_LENGTH]; //le dimensioni sono costanti che ho tralasciato in questo messaggio
        char filename[M_LENGTH];
    int n;
    
        /* In questo tratto di codice carico con una fopen un file,
    prendo la prima riga dove c'è scritto il numero di studenti, 
    che sarà la dimensione del mio vettore. Qui ho tralasciato questa parte */
    
            *vet = studentsalloc(nstudents); 
    /*quando mi fa il return, l'indirizzo di vet non viene cambiato,
    rimane esattamente così com'era prima*/
            return les;
        }
    
    int *studentsalloc(int nstudents){
        int *n = NULL;
        n = (int *) malloc (nstudents*sizeof(int));
        return n; 
        }
    come scritto, il mio problema è che caricando un vettore da allocare dinamicamente in una funzione, per poi caricarlo di nuovo in un altra funzione, l'indirizzo non è cambiato. Allora ho pensato che ci volesse un riferimento di riferimento, ovvero:

    codice:
     /* Prototipi */
    lessons *getfile(lessons *les, int **vet);
    int **studentsalloc(int nstudents);
    
    [...]
    
    lessons *getfile(lessons *les, int **vet){
       [...]
    int n;
            vet = studentsalloc(nstudents); /* tolgo un asterisco */
            return les;
        }
    
    int **studentsalloc(int nstudents){ 
        int *n = NULL;
        n = (int *) malloc (nstudents*sizeof(int));
        return n;  /* ora mi dice Return from incompatible pointer type */
        }
    se provo con il debug, vedo che l'indirizzo di vet viene modificato con quello di n, come voglio io, ma se provo ad accedere a un parte di memoria di vet, per esempio mettendo un 5 in *(vet+1), e facendo la printf mi viene SIGSEGV...

    devo per forza fare un cast a quel return n?
    sto impazzendo, la logica dei puntatori mi è piu o meno chiara, sto studiando sodo :master:

  2. #2
    il mio problema è che caricando un vettore da allocare dinamicamente in una funzione, per poi caricarlo di nuovo in un altra funzione, l'indirizzo non è cambiato
    probabilmente non ho capito cosa vuoi fare. Perchè l'indirizzo di Vet dovrebbe cambiare?
    Vet punta allo spazio in memoria creato nella funzione "studentsalloc". Un indirizzo diverso vorrebbe dire puntare ad un altro spazio...

  3. #3
    ciao,
    grazie della tua risposta.
    Comunque ho capito cosa non andava.
    Io ho modificato una porzione di memoria per farci stare dentro una struttura.
    In un altra funzione ho provato, tramite un puntatore a struttura, ad accedere a un'area di memoria diversa da quella che ho allocato io, per questo l'errore (o almeno da quanto ho capito).

    Sbatterci la testa molte volte funziona

  4. #4

    Re: [C] problema sui puntatori

    Originariamente inviato da solid gear
    codice:
    ...[CUT]...
    
    int **studentsalloc(int nstudents){ 
        int *n = NULL;
        n = (int *) malloc (nstudents*sizeof(int));
        return n;  /* ora mi dice Return from incompatible pointer type */
        }
    se provo con il debug, vedo che l'indirizzo di vet viene modificato con quello di n, come voglio io, ma se provo ad accedere a un parte di memoria di vet, per esempio mettendo un 5 in *(vet+1), e facendo la printf mi viene SIGSEGV...

    devo per forza fare un cast a quel return n?
    sto impazzendo, la logica dei puntatori mi è piu o meno chiara, sto studiando sodo :master:
    ti da errore perche' la variabile "n" e' dichiarata "int *" e la funzione invece ritorna un "int **" e quindi non va bene.

    ma quello che non capisco e' perche' usare un puntatore a puntatore (int **) invece che semplicemente un puntatore (int *).....
    Administrator of NAMDesign.Net

  5. #5
    ma no quella era una cavolata che ho provato a fare sotto la disperazione

    ora ho capito piu o meno la logica del metodo che dovevo usare

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.