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

    [C] Segmentation fault

    Ho questo piccolo programma che ha lo scopo di convertire da minuscolo a maiuscolo
    in due differenti modi. Il problema è che quando si arriva all'istruzione *str = toupper( *str ); avviene un errore di segmentazione.

    codice:
    #include<stdio.h>
    
    int main()
    {
       char vet[100] = "Hello, come va?";
       char *str = "Hello, come va?";
       int i = 0;
    
       printf("La dim di vet è %d\nLa dim di str è %d\n", sizeof(vet[0]), sizeof(*str) );
       while( vet[i] != '\0' )
       {
          vet[i] = toupper( vet[i] );
          i++;
          
       }
       printf("Vet in maiuscolo: %s\n", vet );
    
       while( *str != '\0' )
       {
          *str = toupper( *str );
          ++str;
       }
       printf("str in maiuscolo: %s\n", str );
    }
    L'output è questo:
    codice:
    La dim di vet è 1
    La dim di str è 1
    Vet in maiuscolo: HELLO, COME VA?
    Segmentation fault
    Perché mi da "Segmentation fault"?



    P.S. Può essere irrilevante, ma uso come compilatore gcc.

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    int main()
    {
       char vet[100] = "Hello, come va?";
       char *str = (char *)malloc(sizeof(char)*strlen(vet));
       strcpy(str, vet);
       int i = 0;
    
       printf("La dim di vet è %d\nLa dim di str è %d\n", sizeof(vet[0]), sizeof(*str) );
       while( vet[i] != '\0' )
       {
          vet[i] = toupper( vet[i] );
          i++;
          
       }
       printf("Vet in maiuscolo: %s\n", vet );
       
    	 i = 0;
       while( str[i] != '\0' )
       {
          str[i] = toupper( str[i] );
          i++;
          
       }
       printf("str in maiuscolo: %s\n", str );
       free(str);
       return 0;
    }
    Così funziona!
    Quel puntatore è un puntatore ad una costante di cui ovviamente non puoi modificare il valore!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    In effetti, scrivere
    codice:
    char * p = "una stringa";
    è deprecato, dato che in realtà la stringa con cui lo stai inizializzando non è modificabile; la cosa corretta da fare è
    codice:
    const char * p = "una stringa";
    in modo che il compilatore ti avvisi che non la puoi modificare già a compile-time.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Grazie delle risposte! Per adesso mi sembra di capire che il modo in cui ho inizializzato *str è equivalente ad inizializzare un puntatore variabile a dati costanti, da qui l'errore nel assegnare ad *str un valore. Tra l'altro mi è scappato che la maniera in cui incrementavo str nel ciclo while non mi avrebbe fatto stampare la stringa.
    Beh, sarà bene che mi studi meglio l'argomento. Almeno adesso so più precisamente che parte studiare.

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.