2012-07-02 23 views
13

Eventuali duplicati:
Segmentation Fault when attempting to print value in CImpossibile assegnare valori alle variabili e puntatore

Sono molto nuovo a C, ma non hanno idea perché questo programma si rompe. Il programma viene compilato ed eseguito se rimuovo le righe che hanno a che fare con i, ma se assegno i, non posso più assegnare nulla a *ptr senza interrompere il programma.

int main(void) 
{ 
    int i; 
    int *ptr; 

    i = 2; 
    *ptr = 5; 
    printf("%d",*ptr); 
} 
+2

[Questo] (http://stackoverflow.com/questions/11278085/segmentation-fault-when- tentando di stampare il valore in c) la domanda quasi identica è stata posta proprio ieri. – pb2q

+0

Il problema è che hai creato un puntatore, ma non gli hai dato nulla a cui puntare. Puoi assegnargli un po 'di memoria usando il nuovo o puntarlo su una variabile come i. – jlunavtgrad

risposta

11

Si lascia il puntatore con valore non inizializzato. Quindi, quando lo si denigra (*ptr), si accede alla posizione arbitraria in memoria, causando un errore di segmentazione.

Point ptr qualcosa assegnando a ptr stessa (non *ptr) un indirizzo di una variabile (come &i) o qualche memoria appena allocata (come malloc(sizeof(int))).

+0

Quindi perché funziona se uso semplicemente 'int * ptr;' '* ptr = 5;'? –

+0

Potrebbe "funzionare" o potrebbe bloccarsi, a seconda della piattaforma, del compilatore, delle impostazioni ... In ogni caso, non è corretto. C è un linguaggio non sicuro e non controlla gli errori di memoria, potrebbero passare inosservati nel programma e colpire quando non previsti. :) – Kos

+1

Grazie! Non ho mai lavorato con un linguaggio di gestione della memoria manuale prima, quindi questo è tutto nuovo per me. Sicuramente molto altro a cui pensare. –

-1

Prima di utilizzare un puntatore in C, è necessario sia per impostare il puntatore a un blocco esistente della memoria, è necessario allocare memoria per esso, come questo.

int *ptr = (int *)malloc(sizeof(int)); 
4

Ecco la risposta per C:

int main(void) { 
    int i; 
    int * ptr = (int *)malloc(sizeof(int)); 

    i = 2; 
    *ptr = 5;  
    printfn("%d",*ptr); 
    free(ptr); 
} 

In alternativa si potrebbe per la ie * linee di assegnazione PTR usare qualcosa come:

int main(void) { 
    int i; 
    int * ptr; 

    i = 2; 
    ptr = &i;  
    printfn("%d",*ptr); // should print 2 
} 

Si noti inoltre che la libera è venuto fuori !!!

1

Hai dichiarato ptr ma non ha puntato a nulla. Quindi hai provato a scrivere a cosa punta. Questa non è mai una buona idea. Prova a fare il punto PTR per i aggiungendo la riga

ptr = &i; 

prima di provare a scrivere a * ptr

Problemi correlati