2012-06-30 20 views
6

Następujący kod C zwraca błąd "błąd segmentacji". Nie rozumiem, dlaczego nie zwraca wartości 20. Jaki jest mój błąd?Błąd segmentacji przy próbie drukowania wartości w C

#include <stdio.h> 

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

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

    return 0; 

} 
+0

'n' jest niezainicjowany wartość wskaźnik, że jesteś dereferencing w wierszu „* n = 20 ". Jeśli chcesz użyć wskaźnika, musisz go zainicjować, aby wskazywał prawidłowe miejsce w pamięci, zanim spróbujesz usunąć zaznaczenie. – reuben

+0

Alternatywnie do odpowiedzi już podanych, możesz po prostu 'int n = 20' i przekazać' & n' (adres n), do jakiejkolwiek funkcji wymaga 'int *' jako parametru. – Vassilis

Odpowiedz

14

Nie przydzielona pamięć n, więc

*n = 20; 

próby zapisu pamięci nieokreślony.

Spróbuj

#include <stdlib.h> 

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

Nie zapomnij zwolnić n, gdy skończysz! –

+0

Dobrze, że. –

4

Nie przydzielone miejsce na int, masz zadeklarowane tylko wskaźnik do int.

Wskaźnik jest niezainicjowany, a więc zapis do tej nieznanej przestrzeni w pamięci jest niezdefiniowanym zachowaniem i powoduje problemy. Zwykle powoduje to segfault.

można przydzielić gniazdo do liczby całkowitej korzystając malloc:

n = malloc(sizeof(int)); 

i użyć odpowiedniego połączenia do free aby zwolnić pamięć nowszym:

free(n); 

Ale przydzielania jedno gniazdo dla liczba całkowita jest dość nietypowa, zazwyczaj można przydzielić int na stosie:

int n; 
n = 20; 
1

Próbujesz pisać 20 wartości śmieci. Musisz przydzielić dla niego miejsce, używając jednej z funkcji *alloc() lub tworząc int na stosie i zdobywając jego andress (tak jak Richard J. Ross III wspomniał o komentarzach).

dynamiczna alokacja:

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

lub na stos:

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

Należy zauważyć, że 'malloc' nie jest jedynym rozwiązaniem. Istnieje 'mmap',' alloca' i po prostu tworzenie int na stosie i otrzymywanie jego adresu. –

+0

@ RichardJ.RossIII: Dzięki. Zaktualizowano. – Jack

+0

Przykład twojego stosu nie jest zgodny z "zdobyciem tego, co jest". To, czego chcesz, to 'int onstack; int n = & onstack; * n = 20; printf ("% i \ n", * n); '... Hej, mam uprawnienia do edycji, więc poszedłem do przodu i wprowadziłem zmianę. –

Powiązane problemy