2012-06-30 16 views
6

zu drucken. Der folgende C-Code gibt einen "Segmentierungsfehler" -Fehler zurück. Ich verstehe nicht, warum es den Wert 20 nicht zurückgibt. Was ist mein Fehler?Segmentierung Fehler beim Versuch, einen Wert in C

#include <stdio.h> 

int main() 
{ 
    int* n; 
    *n = 20; 

    printf("%i\n",*n); 

    return 0; 

} 
+0

'n' ist ein nicht initialisierten Zeiger Wert, den Sie in der Zeile ‚sind dereferencing * n = 20 ". Wenn Sie einen Zeiger verwenden möchten, müssen Sie sicherstellen, dass Sie ihn so initialisieren, dass er auf einen gültigen Speicherort verweist, bevor Sie versuchen, ihn zu dereferenzieren. – reuben

+0

Alternativ zu den bereits gegebenen Antworten könnten Sie einfach "int n = 20" und "& n" (die Adresse von n) übergeben, an die Funktionen, die "int *" als Parameter benötigen. – Vassilis

Antwort

14

Sie haben keinen Speicher zu n, so

*n = 20; 

versucht zu schreiben, nicht näher bezeichnete Speicher zugewiesen.

Versuchen

#include <stdlib.h> 

int *n = malloc(sizeof *n); 
/* use n */ 
free(n); 
+1

Vergessen Sie nicht, n freizugeben, wenn Sie fertig sind! –

+0

Guter Punkt, dass. –

4

Sie nicht Platz für Ihre int zugewiesen haben, haben Sie erklärt nur einen Zeiger zu einem int.

Der Zeiger ist nicht initialisiert und daher ist das Schreiben in diesen unbekannten Speicherbereich ein nicht definiertes Verhalten und führt zu Problemen. Dies führt normalerweise zu einem Segmentfehler.

Sie können einen Steckplatz für eine ganze Zahl zuweisen malloc mit:

n = malloc(sizeof(int)); 

und einen entsprechenden Aufruf an free verwenden, um später den Speicher freizugeben:

free(n); 

Aber einen Steckplatz für eine Zuweisung Ganzzahl ist ziemlich ungewöhnlich, normalerweise würden Sie die int auf dem Stapel zuweisen:

int n; 
n = 20; 
1

Sie versuchen 20 in Müll Wert zu schreiben. Sie müssen Speicherplatz dafür reservieren, indem Sie eine der Funktionen *alloc() verwenden oder einen int-on-Stack erstellen und die andress holen (wie Richard J. Ross III in den Kommentaren erwähnt hat).

dynamische Zuordnung:

int n*; 
n = malloc(sizeof(int)); /* allocate space for an int */ 
if(n != NULL) { 
/* do something.. */ 
free(n); /* free 'n' */ 
} else { 
    /*No space available. */ 
} 

oder auf dem Stapel:

int int_on_stack; 
int *n = &int_on_stack; 
*n = 20; 
printf("%i\n", *n); // 20 
+1

Beachten Sie, dass "Malloc" nicht die einzige Lösung ist. Es gibt 'mmap',' alloca' und einfach einen int auf dem Stack zu erstellen und die Adresse davon zu bekommen. –

+0

@ RichardJ.RossIII: Danke. Aktualisiert. – Jack

+0

Ihr Stack-Beispiel ist nicht konsistent mit dem "Abrufen der Anfrage". Was du willst, ist 'int estack; int n = & estack; * n = 20; printf ("% i \ n", * n); '... Hey, ich habe Bearbeitungsrechte, also habe ich die Änderung vorgenommen. –

Verwandte Themen