Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: [c] Segmentation fault

  1. #1

    [c] Segmentation fault

    codice:
    main()
    {
    
    	char *s = "buona!";
    	char *t = "notte";
    
    	printf("La stringa1 e': %s\n", s);
    	printf("La stringa2 e': %s\n", t);
    
    
     while((*s = *t) != '\0')
    	s++;
    	t++;
    
    	printf("la stringa concatenata è: %s", t);
    
    
    }
    Secondo voi perchè quando lancio questo programma il mio pc mi dice segmentation fault????
    Un grazie anticipato a tutti i generosi forumisti!
    ---smile is your life---:-)---

  2. #2
    Errore di Allocazione della Memoria...

    Prova a specificare le dimensioni delle due stringhe...
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  3. #3
    E' proprio quello che non posso fare ed è per questo che uso i puntatori!

    Non capisco proprio cosa non vada bene in questo codice...!
    ---smile is your life---:-)---

  4. #4
    Se devi usare la memoria in modo dinamico usa la funzione malloc...

    codice:
    #include <malloc.h>
    
    puntatore = malloc (dimensioneDaAllocare);
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  5. #5

    Re: [c] Segmentation fault

    Originariamente inviato da mr.smile
    codice:
    main()
    {
    
    	char *s = "buona!";
    	char *t = "notte";
    
    	printf("La stringa1 e': %s\n", s);
    	printf("La stringa2 e': %s\n", t);
    
    
     while((*s = *t) != '\0')
    	s++;
    	t++;
    
    	printf("la stringa concatenata è: %s", t);
    
    
    }
    Secondo voi perchè quando lancio questo programma il mio pc mi dice segmentation fault????
    Un grazie anticipato a tutti i generosi forumisti!

    hai dimenticato le parentesi graffe:
    codice:
    while((*s = *t) != '\0')  {
        s++;
        t++;
    }

    in quel modo il ciclo non si fermava mai perché avanzava solo s e non t, di conseguenza il valore di (*s = *t) era sempre uguale a *t (e diverso da zero).


    ps: Se vuoi qualcosa di più figo scrivi:
    codice:
    while((*s++ = *t++) != '\0');

  6. #6
    Hai ragione SnakePlissken... il codice che ho scritto riporta questo problema ma è che ho provato così tante volte a modificare quel codice prima di postare che alla fine c'era quell'errore...!

    Il problema è che anche con le correzioni non cambia nulla... PERMANE IL SEGMENTATION FAULT... eppure mi sembra chiaro quel pezzo di codice... e proprio non capisco perchè...
    ---smile is your life---:-)---

  7. #7

    Re: [c] Segmentation fault

    Prova cosi'
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(){
    
    char *s; 
    char *t;
    s = (char *) malloc (6*sizeof(char)); //6 perchè "buona" ha 5 caratteri + il \0 (cioè NULL)
    t = (char *) malloc (6*sizeof(char)); //sempre 6 vista la lunghezza di "notte" + NULL
    
    s="buona";
    t="notte";
    
    	printf("La stringa1 e': %s\n", s);
    	printf("La stringa2 e': %s\n", t);
    
                 /* ora le concateno */
    
    //la stringa s dovrà contenere anche t quindi...
    
    s = (char *) realloc (s,12*sizeof(char));
    
    int i;
    for(i=strlen(s)+1, j++; i<12; i++, j++){
      s[i] = t[j]; 
    } 
    
    
    printf("la stringa concatenata è: %s", t);
    
    return 0;
    }
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  8. #8
    oops.. è vero...
    non avevo notato un particolare.

    Dichiarandeo s e t in questo modo

    codice:
    char *s = "buona!";
    char *t = "notte";
    è come se dicessi al compilatore:

    <<Alloca in memoria la stringa "buona!" e poi fa puntare s all'inizio di questo spazio di memoria.>>
    <<Alloca in memoria la stringa "notte" e poi fa puntare t all'inizio di questo spazio di memoria.>>

    Il risultato è che le stringhe "buona!" e "notte" sono gestite come se fossero in memoria di sola lettura, cosicché non puoi sovrascrivere niente. Se invece le avessi dichiarate s[] e t[] allora sovrascriverle sarebbe stato perfettamente lecito. Ma per contro non avresti potuto modificare il valore di s e t, non potendole usare quindi come puntatori.
    Comunque questo comportamento dipende da compilatore a compilatore (il mio Borland non mi dà problemi).

    Ti consiglio di cercare da qualche parte se ne vuoi sapere di più (ma il succo è questo).




    ps: implementalo in una funzione quel ciclo, così da una parte puoi modificare a piacimento i puntatori, dall'altra non ci sono problemi nella modifica delle stringhe e nel ritorno all'inizio delle stesse.

    codice:
    #include<stdio.h>
    
    void copia_stringa(char * d, const char* s)  {
    	while(*d++ = *s++);
    }
    
    int main()  {
    
    	char s[] = "buona!";
    	char t[] = "notte";
    
    	clrscr();
    	printf("La stringa1 e': %s\n", s);
    	printf("La stringa2 e': %s\n", t);
    
    	copia_stringa(s, t);
    
    	printf("la stringa concatenata è: %s",	s);
    
    	getch();
    }
    pps: andrea, non serve fare come hai scritto tu, in parte questo thread ne è la risposta :metallica

  9. #9
    Originariamente inviato da SnakePlissken


    pps: andrea, non serve fare come hai scritto tu, in parte questo thread ne è la risposta :metallica
    la risposta a cosa?

    se non "ingrandisci" (con realloc come ho fatto io ,o il resize per il c++)la stringa di destinazione della concatenazione(ad es s ,ossia la prima) come fai a copiarci anche t?

    certo usando i puntatori,come fai tu, senza allocare memoria e quindi passare agli array va bene

    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  10. #10
    Se fai così è un conto:
    codice:
    char *s, *t;
    e allora devi allocare tu la memoria.

    Ma se invece fai:
    codice:
    char *s = "buona!";
    char *t = "notte";
    è come se dicessi al compilatore:

    <<Alloca in memoria la stringa "buona!" e poi fa puntare s all'inizio di questo spazio di memoria.>>
    <<Alloca in memoria la stringa "notte" e poi fa puntare t all'inizio di questo spazio di memoria.>>
    :gren: :metallica


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.