PDA

Visualizza la versione completa : [C] Problema con l'allocazione


johnnny
23-05-2013, 16:32
Nel ciclo for se voglio inserire più di un elemento, il primo mi fa mettere i campi prior e dato senza alcun problema, ma dals econdo in poi mi va in segmentation fault nel punto in cui fa la malloc per elem ( prima istruzione del for ). Come mai ?



struct elemento{
int prior;
int dato;
};
typedef struct elemento elem;

struct infor{
int size;
struct elemento *first;
};
typedef struct infor heap;

int main(){
elem **vet;
heap *A;
int n,i;
printf("\n\n Digita il numero di elementi che vuoi inserire : \n\n");
scanf("%d",&n);
vet=(elem **)malloc(n*sizeof(elem *));
for(i=0;i<n;i++){
vet[i]=(elem *)malloc(sizeof(elem));
printf("\n\n Digita il valore della %d priorita' : ", i);
scanf("%d",vet[i]->prior);
getchar();
printf("\n\n Digita il valore del %d dato : ", i);
scanf("%d",vet[i]->dato);
getchar();
}
printf("\n\n La prima priorita' vale : %d : ",vet[0]->prior);
system("PAUSE");

return 0;
}

MItaly
23-05-2013, 17:58
La scanf vuole dei puntatori alla locazione dove deve memorizzare il dato letto...


scanf("%d",&vet[i]->prior);
getchar();
printf("\n\n Digita il valore del %d dato : ", i);
scanf("%d",&vet[i]->dato);

(inoltre, non hai incluso <stdio.h>)

johnnny
23-05-2013, 21:48
Ok, modificando la scanf con la & adesso funziona. So che la scanf vuole l'indirizzo della variabile, e non l'avevo messa perchè essendo quello un vettore dinamico, pensavo che con vet[posizione] prendevo l'indirizzo di quella determinata locazione.

La libreria stdio l'ho inclusa è che non l'ho copiata nel codice che ho postato.

Adesso avrei un'altro tipo di problema, dopo aver riempito il vettore, io metto l'indirizzo della prima cella del vettore come valore del puntatore A. E la prima printf di A mi stampa il valore, mentre se porovo ad accedere alla seconda cella del vettore sempre tramite il puntatore che ho in A mi stampa un indirizzo, come mai ?



#include<stdio.h>
#include<stdlib.h>

struct elemento{
int prior;
int dato;
};
typedef struct elemento elem;

struct infor{
int size;
struct elemento *first;
};
typedef struct infor heap;

int main(){
elem **vet;
heap *A;
int n,i;
printf("\n\n Digita il numero di elementi che vuoi inserire : ");
scanf("%d",&n);
vet=(elem **)malloc(n*sizeof(elem *));
for(i=0;i<n;i++){
*(vet+i)=(elem *)malloc(sizeof(elem));
printf("\n Digita il valore della %d priorita' : ", i);
scanf("%d",&vet[i]->prior);
getchar();
printf("\n Digita il valore del %d dato : ", i);
scanf("%d",&vet[i]->dato);
getchar();
}
A->first=vet[0];
printf("\n Priorita' di A[0] = %d ",(A->first)->prior);
printf("\n Priorita' di A[1] = %d ",((A->first+1)->prior));
system("PAUSE");


return 0;
}

oregon
23-05-2013, 22:56
Prima di tutto manca l'allocazione di A ... in realtà penso che ci sia un equivoco sulla struttura complessiva dei dati ... non esiste un A[0] e un A[1] ...



struct infor{
int size;
elem **first;
};


A = (heap *)malloc(sizeof(heap));
A->size = n;
A->first = vet;
printf("\n Priorita' di A[0] = %d ", (*(A->first))->prior);
printf("\n Priorita' di A[1] = %d ", (*(A->first+1))->prior);

johnnny
24-05-2013, 02:12
Grazie mille Oregon, in effetti non esiste A[0] e A[1] era una stampa per far intendere che io dal primo indirizzo del vettore posso ricavarmi con l'aritmetica dei puntatori quelli successivi ;)

johnnny
24-05-2013, 02:16
Ma in questo pezzo di codice come posso correttamente sostituire il "&vet[i]->prior" utilizzando l'aritmetica dei puntatori ? Ho provato con (vet+i)->prior ma mi segnala erorre in compilazione.



printf("\n Digita il valore della %d priorita' : ", i);
scanf("%d",&vet[i]->prior);
getchar();
printf("\n Digita il valore del %d dato : ", i);
scanf("%d",&vet[i]->dato);
getchar();

oregon
24-05-2013, 10:51
Direi che è più chiaro nell'altro modo ... comunque

scanf("%d", &(*(vet+i))->prior );

scanf("%d", &(*(vet+i))->dato );

Loading