Array dinamici come parametro di funzione C

di il
16 risposte

Array dinamici come parametro di funzione C

Salve! Avrei un problema per quanto riguarda il passaggio di array dinamici alle funzioni in linguaggio C
Mi spiego meglio, devo realizzare la seguente funzione:

//funzione che prende in input un array che verrà allocato dinamicamente nella funzione stessa
int inserisciElementi(int *vettore){
int n;
printf("Quanti elementi vuoi inserire? ");
scanf("%d", &n);
vettore = malloc(n * sizeof(int)); //allocazione dinamica della memoria
    for(int i=0; i<n; i++){
        scanf("%d", &vettore[i]); //caricamento degli elementi all'interno dell'array
    }
}

int main(){

int *vettore;
inserisciElementi(vettore);
printf("%d", vettore[2]); //stampa di prova per verificare che i valori inseriti nell'array siano visibili anche all'esterno della funzione (per esempio indice 2)

}
Come mai quando provo a stampare gli elementi fuori dalla funzione, non vengono stampati? vengono fuori numeri a caso, cosa che non succede quando uso array non dinamici. Grazie in anticipo

16 Risposte

  • Re: Array dinamici come parametro di funzione C

    Intanto usa i tag code p il codice non si capisce
  • Re: Array dinamici come parametro di funzione C

    Ho modificato, spero sia più chiaro adesso
  • Re: Array dinamici come parametro di funzione C

    Perché la variabile vettore che sta fuori non è la stessa che usi all'interno della funzione, anche se hai tentato di chiamarle con lo stesso nome. Che ne sa la variabile a monte dove hai allocato l'array?

    Usa la funzione di ricerca dei vecchi post per cercare la chiamata giusta, altrimenti prova da solo che è più istruttivo
  • Re: Array dinamici come parametro di funzione C

    Ma gli array non vengono passati di default per indirizzo? Io so che quando passi una variabile per valore, viene effettuata una copia e in caso di modifica perdi tale modifica, ma l'array viene passato già per indirizzo, quindi mi sembra strano che i valori vengano persi fuori dalla funzione
    Tant'è vero che se uso un array statico, non ho questo problema, il problema è con quello dinamico
  • Re: Array dinamici come parametro di funzione C

    ... e quindi? Comincia a cambiare il nome delle variabili e rifletti passo per passo su quanto accade, magari con un debugger
  • Re: Array dinamici come parametro di funzione C

    Ma gli array non vengono passati di default per indirizzo?
    Il problema è che la domanda è posta male perché basata su un'eccessiva semplificazione...

    Nel C il passaggio degli argomenti avviene SEMPRE per valore (ossia per copia). Quindi se vogliamo che una funzione lavori direttamente su una variabile dichiarata al di fuori della funzione stessa, l'unico modo è accedere ad essa attraverso il suo indirizzo di memoria (da cui il nome passaggio per indirizzo), che passeremo alla funzione attraverso un parametro formale di tipo puntatore opportuno.

    Gli array statici non sono puntatori, ma costituiscono dei tipi a parte. Considerando per esempio i seguenti array
    int u[2];
    int v[3];
    va detto che u e v sono di tipo diverso, ossia rispettivamente di tipo int[2] e int[3].
    Anche se gli array statici non sono puntatori, esiste cmq uno stretto legame tra di loro: ossia l'identificatore di un array, tranne poche eccezioni (tra cui va annoverato l'operatore sizeof), viene sempre convertito in un puntatore al suo primo elemento. Questo è il motivo per cui una funzione
    fun(int *ptr)
    accetta come parametri attuali sia u che v.

    Quindi, tornando alla tua domanda, si deduce che il passaggio può essere considerato per indirizzo se lo scopo è quello di lavorare sugli elementi dell'array, ma se invece vogliamo modificare il puntatore passato come parametro formale, allora il passaggio non è per indirizzo, e l'output che ricevi ne è la prova!
  • Re: Array dinamici come parametro di funzione C

    E allora visto che non lo sto passando per indirizzo (con l'operatore *) come faccio a passarlo per indirizzo? Cioè nella sintassi cosa dovrei cambiare?
  • Re: Array dinamici come parametro di funzione C

    Se lo scopo è quello di modificare un puntatore passato come parametro formale ad una funzione, allora per quanto detto prima dovrai passare alla funzione l'indirizzo di memoria del suddetto puntatore. Ora la domanda è: di che tipo dovrà essere il parametro formale preposto a ricevere l'indirizzo di memoria di un puntatore ad int?
  • Re: Array dinamici come parametro di funzione C

    lippolis2000 ha scritto:


    E allora visto che non lo sto passando per indirizzo (con l'operatore *) come faccio a passarlo per indirizzo? Cioè nella sintassi cosa dovrei cambiare?
    #include <stdio.h>
    #include <stdlib.h> 
    
    int inserisciElementi(int ** vettore){
    int n;
    printf("Quanti elementi vuoi inserire? ");
    scanf("%d", &n);
    *vettore = (int *)malloc(n * sizeof(int));
        for(int i=0; i<n; i++){
            scanf("%d", &(*vettore)[i]);
        }
    }
    
    int main(){
    int * vettore;
    inserisciElementi(&vettore);
    printf("%d", vettore[2]);
    return 0;
    }
  • Re: Array dinamici come parametro di funzione C

    Weierstrass ha scritto:


    Usa la funzione di ricerca dei vecchi post per cercare la chiamata giusta, altrimenti prova da solo che è più istruttivo
    cit.
  • Re: Array dinamici come parametro di funzione C

    Ho capito che dovrei provare da solo ma sono giorni che ci sto sbattendo e siccome non riesco ho chiesto qui
  • Re: Array dinamici come parametro di funzione C

    Vabbé almeno adesso è chiaro cosa mancava?
  • Re: Array dinamici come parametro di funzione C

    Più o meno, mi spieghi solamente il motivo del doppio asterisco nell'intestazione della funzione? Significa che sto accedendo al valore contenuto nella prima cella del vettore? Sui puntatori ho ancora qualche incertezza
    E anche la & nella chiamata
    Grazie mille, a casa provo se funziona
  • Re: Array dinamici come parametro di funzione C

    Ma quello che ti ho scritto in precedenza lo hai letto? Non che tua sia obbligato a farlo, chiedo solo per curiosità!
Devi accedere o registrarti per scrivere nel forum
16 risposte