Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    22

    [C] problema malloc e passaggio di vettori a funzioni

    Ciao, perchè quando provo ad eseguire questo codice il programma crasha?????
    codice:
    #include <stdio.h>
     #include <stdlib.h>
     void funzione(int *vettore);
     int main()
     {
         int *v;
         funzione(v);
         printf("%d", v[0]);
         return 0;
     }
     void funzione(int *vettore)
     {
         int i,n;
         vettore = (int*) malloc(5*sizeof(int));
         for(i=0; i<5; i++)
             {
                 vettore[i]=i;
                 n = vettore[i];
             }
         return;
     }
    Se dichiaro il vettore come
    codice:
    int v[5]
    direttamente nel main e poi lo passo alla funzione tutto fila liscio come l'olio, la funzione fa il suo dovere e quando ritorno nel main ho il vettore modificato.... se invece passo alla funzione solo il puntatore e provo ad allocarlo dinamicamente solo all'interno di essa non ottengo un bel niente!!!

    Se 0x5c era l'indirizzo contenuto nella variabile puntatore int *v, premendo "step into" all'istruzione
    codice:
    funzione(v)
    in modalità debug, nella cella della tabella Waches accanto alla variabile int *vettore c'è scritto 0x5c, cioè significa che il parametro è stato passato correttamente, ed ovviamente se scrivo vettore[0] prima che venga eseguita l'istruzione
    codice:
    vettore = (int*) malloc(5*sizeof(int));
    , accanto e in rosso appare il messaggio "cannot access memory at address 0x5c"....
    la cosa sconvolgente è che, anche dopo che quest'ultima viene eseguita, la scritta da rossa diventa nera ma rimane ugualmente e cosa ancor più sconcertante è che mentre eseguo il ciclo vedo che la variabile n assume esattamente i valori che dovrebbe contenere vettore[i] (per i=0: n=0, i=1: n=1...), ma se provo a scrivere vettore[0], vettore[1], vettore[2] nella Watches non posso vedere una beneamata m... !!!! Ed ovviamente quando ritorno al main se provo ad accedere ad una cella del vettore v ottengo sempre la stessa cosa "cannot access memory at address 0x5c"....

    Questo è il codice
    Ultima modifica di rino95; 29-11-2016 a 02:23

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Tu non gli passi l'indirizzo di un array, ovvero di uno spazio di memoria allocato, gli passi un valore
    casuale perché il puntatore è locale al main, ma anche se lo inizializzassi a NULL non otterresti niente.

    O allochi memoria con malloc nel main(), e poi la funzione si limita a gestirlo come un array dinamico, o allochi memoria nella funzione e la restituisci al puntatore nel main().


    codice:
    // Alloco memoria nella funzione e la restituisco al main con return
    #include <stdio.h>
     #include <stdlib.h>
     int* funzione();
     int main()
     {
         int *v=NULL;
         v=funzione();
         printf("%d", v[3]);
         getchar();
         return 0;
     }
     int* funzione()
     {
         int i,n;
         int *vettore = (int*) malloc(5*sizeof(int));
         for(i=0; i<5; i++)
             {
                 vettore[i]=i;
                 n = vettore[i];
             }
         return vettore;
     }
    
    // alloco memoria nel main e gestisco come array
    
    
    #include <stdio.h>
     #include <stdlib.h>
     void funzione(int *);
     int main()
     {
         int *v=(int*) malloc(5*sizeof(int));
         funzione(v);
         printf("%d", v[3]);
         getchar();
         return 0;
     }
     void funzione(int *vettore)
     {
         int i,n;
         
         for(i=0; i<5; i++)
             {
                 vettore[i]=i;
                 n = vettore[i];
             }
         
     }
    Tecnologia

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.