PDA

Visualizza la versione completa : [C] problema malloc e passaggio di vettori a funzioni


rino95
29-11-2016, 01:20
Ciao, perchè quando provo ad eseguire questo codice il programma crasha?????

#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
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
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
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

torn24
29-11-2016, 06:56
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().




// 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];
}

}

Loading