Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C] Accesso al puntatore genera Segmentation Fault

    Ciao a tutti, ho programmato in C per parecchio tempo e mi sento un niubbo a fare una domanda del genere, ma purtroppo non ne riesco ad uscirne da solo e quindi chiedo aiuto in ginocchio
    Stavo compilando un programmino in C con l'Eclipse su Linux, ma ho fatto caso che il programma mi si blocca e viene scritto "Segmentation Fault (core dumped)" ogni qual volta che cerco di accedere al contenuto di una stringa nel modo seguente:
    codice:
    char c = 'a';
    char * test;
    test  = (char*) malloc(20);
    test = "questa è una prova";
    test[0] = c; // qui si blocca il programma
    test[0] = (int)c; // se eseguo questa istruzione invece è tutto ok
    In pratica se setto il char mi si blocca tutto, se lo casto ad int funziona alla perfezione... ma la stringa è un array di char!! Buh, mi sento terribilmente ignurante.. Per ora ho messo il cast ad int ma non mi sembra per niente una cosa pulita!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il problema e' in questa linea

    test = "questa è una prova";

    che dovrebbe essere

    strcpy(test, "questa è una prova");

    Il fatto che ti dia un errore o meno a seconda del cast e' casuale ... in realta' dovrebbe darlo sempre ...

  3. #3

    Re: [C] Accesso al puntatore genera Segmentation Fault

    Dichiari un puntatore...
    char * test;

    Gli assegni una zona di memoria allocata dinamicamente
    test = (char*) malloc(20);
    Che in realtà dovrebbe essere :
    test = malloc(sizeof(char)*20);
    (il cast non serve in c)

    test = "questa è una prova";
    Qui assegni allo stesso puntatore l'idirizzo di una stringa literal
    che non è modificabile in nesun modo.
    e la zona di memoria allocata in precedenza non è più utilizzabile...

    Soluzione : utilizza la funzione standard strcpy()
    strcpy( test, "questa è una prova");

    Ciao.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C] Accesso al puntatore genera Segmentation Fault

    Hanno detto tutto Samuele e Oregon

  5. #5
    Avevo appena risolto, comunque grazie mille lo stesso!
    Mi ero un pò arrugginito in c

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Credo che l'errore sia dovuto al fatto che questa istruzione

    codice:
    test = "questa è una prova";
    Non copia la stringa "questa è una prova" nel puntatore test, ma fa puntare test a "questa è una prova".
    In C++ infatti, i "caratteri liberi", come li chiamo io, sono considerati dei const char *, e quindi dei puntatori.
    Inoltre non hai liberato la memoria allocata con malloc (usa free())
    Il codice corretto è quindi

    codice:
    int main()
    {
    char c = 'a';
    char * test;
    test  = (char*) malloc(20);
    strcpy(test,"questa è una prova");
    test[0] = c; 
    free(test);
    return 0;
    }
    Oppure puoi anche sostiturie
    codice:
    test  = (char*) malloc(20);
    strcpy(test,"questa è una prova");
    con
    codice:
     test = strdup("questa è una prova");
    che provvede in automatico all'allocazione.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    abbiamo risposto 3 di noi assieme
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8

    Re: Re: [C] Accesso al puntatore genera Segmentation Fault

    Originariamente inviato da shodan
    Hanno detto tutto Samuele e Oregon
    Possiamo anche aggiungere che era un esempio di memory leak
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Già

    Beh aggiungo solo che è meglio la strncpy che la strcpy, almeno si sa quanto si copia

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Se devi copiare un'intera stringa, non vedo perchè usare strncpy
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

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.