Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C++]Errore di segmentazione

    Salve ragazzi, il codice che ho postato , funge perfettamente, solo che nel momento in cui invece di dichiarare nel main la stringa num_contacts nel seguente modo:
    codice:
    char num_contacts[70]
    , la dichiaro in questo modo:
    codice:
    string num_contacts
    , mi dà come errore: "Errore di segmentazione"... come mai? eppure ho definito un nuovo tipo di dati "typedef char* string".

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef char* string;
    
    using namespace std;
    int main()
    {
    	char num_contacts[70];
    	int start;
    
     	FILE *rubrica;
    	rubrica=fopen ("rubrica.txt" , "r");
    	if (rubrica == NULL) perror ("Errore nell'aperura del file");
    	else {
    		fgets(num_contacts ,10, rubrica);
    		puts(num_contacts);
    		start=atoi(num_contacts);		
    		fclose (rubrica);			
    	}
    	printf("%d",start+10);
       return 0;
    }
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Forse perché con
    codice:
    char num_contacts[70];
    allochi spazio per una stringa d max 69 caratteri mentre con
    codice:
    string num_contacts; // ?????
    allochi spazio SOLO PER UN PUNTATORE???
    PS: Ti consiglio di non mischiare c e c++
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Sotto gli include, ho dichiarato questo nuovo tipo di dati:

    typedef char* string;
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da gaten
    Sotto gli include, ho dichiarato questo nuovo tipo di dati:

    typedef char* string;
    E poi dichiari una variabile di tipo "string", cioè un puntatore a carattere. Dichiarare un puntatore a carattere non implica l'allocazione in memoria dello spazio per scrivere qualcosa, più o meno per lo stesso motivo per cui se pianto un cartello in mezzo a un deserto che punta in una direzione casuale e con su scritto "ufficio postale a 100 m." non è che automaticamente sorge l'ufficio postale a 100 m. E' soltanto un cartello, un'indicazione. Nient'altro.
    Un puntatore è come se fosse quel cartello. Quando lo dichiari ha un valore sporco, casuale, non significativo. Punta ad un'area di memoria qualsiasi dove non è detto che tu abbia permessi di scrittura. Scrivere invece "char num_contacts[70]" significa allocare in memoria spazio per 70 caratteri, quindi hai la possibilità di scriverci (servendoti di num_contacts che è l'indirizzo di base) senza incorrere in errori di violazione di memoria. Ovviamente parliamo di memoria virtuale, ma da un punto di vista astratto ce ne freghiamo.
    In conclusione, o ricorri sempre all'allocazione statica (cioè "char num_contacts[70]"), volendo anche riscrivendo la typedef così

    codice:
    typedef char string[70];
    e quindi la dichiarazione

    codice:
    string num_contacts;
    oppure dichiari un puntatore semplice e poi ricorri all'allocazione dinamica (vedi malloc(), calloc(), realloc() e free()).

    Tutto questo in realtà senza considerare che nel titolo hai scritto C++ anche se il programma non ha nulla di C++, a parte "using namespace std;" che è completamente inutile in quel caso. Se hai la possibilità di programmare in C++ hai la classe string a disposizione, e comunque per l'allocazione dinamica vanno usati gli operatori new/delete.
    every day above ground is a good one

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.