Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 38

Discussione: [C] Puntatori a char

  1. #1

    [C] Puntatori a char

    codice:
    	char *a = "a2a\n";
    	char *b = "b2b\n";
    	printf("%s", strcat(a, b));
    perchè mi da "Segmentation fault"?
    P.

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    se non ricordo male, strcat non ritorna un nuovo char*, ma modifica uno dei puntatori passati, cioè tu dovresti fare così:

    codice:
    char* a = "sd";
    char* b ="sg";
    strcat(a, b);
    printf("%s", a);
    credo sia così, adesso non riesco a controllare

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    strcat non restituisce una stringa. strcat concatena semplicemente la seconda stringa alla prima. Devi fare.
    codice:
    char *a = "a2a\n";
    char *b = "b2b\n";
    strcat(a, b)
    printf("%s", a);

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Appunto

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Credo che sia dovuto al fatto che a e b sono delle costanti: essi sono dei puntatori a 2 locazioni di memoria che sono già allocate e dimensionate per contenere i due valori. dato che strcat() concatena la seconda sringa alla prima, fornendo il risultato nella prima (se non ricordo male), questa operazione produce il segmentation fault, in quanto tu tenti di scrivere della memoria (quella subito dopo l'ultimo carattere della stringa a) che non è allocata per te.


    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Io credo che nello specifico il "Segmentation Fault" sia dato dal semplice fatto che lui si aspetta una stringa null-terminated. Ricevendo invece un intero, non trova il carattere null e va avanti fino al segmentation fault.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il problema è che, anche con le soluzioni proposte sopra, dà l'errore (avevo già provato, proprio perchè so che la funzione strcat() non ritorna una stringa).

    Questo programma, infatti funziona perfettamente:
    codice:
    char a[20] = "ciao";
    char b[5] = "b2b\n";
    strcat(a, b);
    printf("%s", a);
    e pure questo, anche se non stampa certo il risultato voluto:
    codice:
    char a[20] = "ciao";
    char b[5] = "b2b\n";
    printf("%d", strcat(a, b));
    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Sei sicuro di aver provato questo ?

    codice:
    char *a = "a2a\n";
    char *b = "b2b\n";
    strcat(a, b);
    printf("%s", a);
    E' davvero strano perchè a me Borland C++ 5.5.1 su Windows XP lo compila e funziona perfettamente ...

  9. #9
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Originariamente inviato da pprllo
    Sei sicuro di aver provato questo ?

    codice:
    char *a = "a2a\n";
    char *b = "b2b\n";
    strcat(a, b);
    printf("%s", a);
    E' davvero strano perchè a me Borland C++ 5.5.1 su Windows XP lo compila e funziona perfettamente ...
    Di fatti è corretto in quanto scrivere *a ed a[] è la meddesima cosa, e solo in questo caso si fa senza specificare la dimensione in quanto viene ricavata dall'assegnamento: char *a = "a2a\n"; e viene aggiunto anche il terminatore quindi è uguale a scrivere: char a[4] = "a2a\n";


  10. #10
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Originariamente inviato da minoz
    Di fatti è corretto in quanto scrivere *a ed a[] è la meddesima cosa, e solo in questo caso si fa senza specificare la dimensione in quanto viene ricavata dall'assegnamento: char *a = "a2a\n"; e viene aggiunto anche il terminatore quindi è uguale a scrivere: char a[4] = "a2a\n";

    oppure anche char a[] = "a2a\n"

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.