Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [c] stampa di un array genera segmentatio fault

    ciao...

    a me il codice sembra corretto! eppure:

    codice:
    #include <stdio.h>
    #include <unistd.h>
    #include <time.h>
    
    void scambia(int*,int*);
    void crea_array(int *,int);
    void riempi_array(int *,int);
    void stampa_array(int *,int);
    
    int main(){
    
      int *vett;
      int dim;
    
      printf("dimensione array?\n");
      scanf("%i",&dim);
      crea_array(vett,dim);
      riempi_array(vett,dim);
      stampa_array(vett,dim);
    
    
      return 0;
    }
    
    void scambia(int* a,int* b){
      int *temp;
      temp=a;
      a=b;
      b=temp;
    }
    
    void crea_array(int *a,int n){
    
      a=(int *)malloc(sizeof (int)*n);
    }
    
    void riempi_array(int *a, int n){
    
      int i=0;
      int seme=time(NULL);
      srand(seme);
    
      for(i=0;i<n;i++){
        a[i]=rand()%100;
      }
    }
    
    void stampa_array(int *a,int n){
      int i=0;
      for(i=0;i<n;i++){
        printf("valore elemento %i=\n",i);
      }
    }
    output del programma:
    dimensione array?
    10
    valore elemento 0=
    valore elemento 1=
    valore elemento 2=
    valore elemento 3=
    valore elemento 4=
    valore elemento 5=
    valore elemento 6=
    valore elemento 7=
    valore elemento 8=
    valore elemento 9=
    Segmentation fault

    ??? perchè?
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  2. #2

  3. #3
    ammetto di essere completamente rincoglionito oggi...ma non riesco a vedere l'errore!

    . = ?
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    L'errore è qua:

    codice:
    void crea_array(int *a,int n){
    
      a=(int *)malloc(sizeof (int)*n);
    }
    In c gli argomenti delle funzioni sono passati per Valore; questo significa che quando passi un argomento viene creata una copia dell'argomento stesso che è la variabile effettivamente usata nella funzione. crea_array riceve come parametro un 'puntatore a int' "a"; l'argomento "a" è solo una copia del puntatore "vett" che passi nella chiamata della funzione, per questo, finita la funzione, "vett" non punterà al valore restituito da malloc. Le soluzioni sono due:

    1 - ritonare il valore della malloc:

    codice:
    int * crea_array(int n){
      return (int *)malloc(sizeof(int) * n);
    }
    e quindi chiamare crea_array così:

    vett = crea_array(dim);


    2 - Se una funzione deve modificare l'argomento, non bisogna passare l'argomento stesso, ma un puntatore all'argomento. Qual è qui l'argomento da modificare? "vett", quindi bisogna passare un puntatore a "vett":

    crea_array(&vett, dim);

    e ovviamente la crea_array dovrà prendere un putnatore a un puntatore a int:

    codice:
    void crea_array(int **a,int n){
      //Con l'istruzione successiva imposto il valore di vett
      *a=(int *)malloc(sizeof (int)*n);
    }

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  5. #5
    Originariamente inviato da nik600
    ammetto di essere completamente rincoglionito oggi...ma non riesco a vedere l'errore!

    . = ?
    chiedo scusa, avevo sbagliato a postare..
    sono ^4

  6. #6
    grazie mille della spiegazione!

    ora è tutto chiaro!
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

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 © 2024 vBulletin Solutions, Inc. All rights reserved.