Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    [C] Segmentation Fault con strcpy()

    Ciao a tutti.
    Una domanda che probabilmente risulterà più che banale a chi utilizza costantemente il C.

    Il seguente pezzo di codice mi fa terminare il programma con un Segmentation Fault e non capisco perchè (è incriminata l'istruzione in grassetto). Sottolineo che sto sviluppando sotto Linux:
    codice:
    ...
    char **vett;   /* dichiaro un vettore di stringhe */
    ...
    
    if ((vett = (char **) malloc(12 * sizeof(char*))) == NULL) {
       exit(5);
    }
    for(i=0; i<12; i++) {
       if ((vett[i] = (char *) malloc(4 * sizeof(char))) == NULL) {
          exit(6);
       }
       vett[i] = "\0\0\0";
    }
    
    strcpy(vett[0], "gen");
    ...
    Qualcuno mi sa spiegare perchè se utilizzo, invece, questa istruzione tutto funziona correttamente?
    codice:
    vett[i] = "gen";
    Ciao e grazie.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: [C] Segmentation Fault con strcpy()

    Originariamente inviato da LeleFT
    Una domanda che probabilmente risulterà più che banale...
    Non è così?
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Elimina

    vett[i] = "\0\0\0";


    ... e' la causa del problema ed e' anche inutile

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Non ho ancora provato, ma credo di aver capito il perchè quell'istruzione sia la causa del problema...
    Mi sto domandando se il mio cervello funzioni ancora o se si è fuso con l'ultimo temporale...


    Ciao e grazie!
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    In effetti, qualcuno mi spiega perchè dà segmentation fault ? Non riesco ad immaginarne la ragione.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Ok, dico la vaccata: inizializzata in quel modo viene trattata come costante e quindi qualunque tentativo di scriverci dentro dà segmentation fault. E' così ?

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da pprllo
    Ok, dico la vaccata: inizializzata in quel modo viene trattata come costante e quindi qualunque tentativo di scriverci dentro dà segmentation fault. E' così ?
    esatto

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da pprllo
    Ok, dico la vaccata: inizializzata in quel modo viene trattata come costante e quindi qualunque tentativo di scriverci dentro dà segmentation fault. E' così ?
    No ... in realta' non e' proprio cosi'.

    vett[i] e' un puntatore

    Se tu scrivi

    vett[i] = '\0\0\0';

    cambi il valore del puntatore e quando tenti di scrivere usando tale puntatore, arrivi ad una locazione di memoria il cui indirizzo non fa parte degli indirizzi validi per il processo.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Esatto... con quell'istruzione modificavo il valore del puntatore... (ci ho sbattuto la testa per tanto tempo senza vederlo.. ed era lì sotto il mio naso).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Originariamente inviato da oregon
    No ... in realta' non e' proprio cosi'.

    vett[i] e' un puntatore

    Se tu scrivi

    vett[i] = '\0\0\0';

    cambi il valore del puntatore e quando tenti di scrivere usando tale puntatore, arrivi ad una locazione di memoria il cui indirizzo non fa parte degli indirizzi validi per il processo.
    Però le funzioni in "lettura" funzionano alla perfezione. Come si spiega questo ?

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.