Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152

    [C] Problema con l'allocazione

    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 ?

    codice:
    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;
    }

  2. #2
    La scanf vuole dei puntatori alla locazione dove deve memorizzare il dato letto...
    codice:
             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>)
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152
    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 ?

    codice:
    #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;
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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] ...

    codice:
    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);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152
    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.

    codice:
     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();

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Direi che è più chiaro nell'altro modo ... comunque

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

    scanf("%d", &(*(vet+i))->dato );
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.