2012-07-02 14 views
13

Powiel możliwe:
Segmentation Fault when attempting to print value in CNie można przypisać wartości do zmiennej i wskaźnik

Jestem bardzo nowe do C, ale nie mam pojęcia, dlaczego to przerwy programu. Program kompiluje się i działa, jeśli usuwam linie, które mają do czynienia z i, ale jeśli przypiszę i, nie mogę już przypisać niczego do *ptr bez przerwania programu.

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

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

[W] (http://stackoverflow.com/questions/11278085/segmentation-fault-when- próba drukowania wartości w c) prawie _identyczne_ pytanie zadano tylko wczoraj. – pb2q

+0

Problem polega na tym, że utworzyłeś wskaźnik, ale nie dałeś mu niczego do wskazania. Możesz przypisać mu trochę pamięci za pomocą nowego lub skierować go do zmiennej takiej jak i. – jlunavtgrad

Odpowiedz

11

Zostawia wskaźnik o niezainicjowanej wartości. Więc kiedy usuniesz zaznaczenie (*ptr), uzyskasz dostęp do dowolnego miejsca w pamięci, co spowoduje błąd segmentacji.

Punkt ptr na coś przez przypisanie do samego ptr (nie *ptr) adres zmiennej (jak &i) lub jakiś świeżo przydzieloną pamięć (jak malloc(sizeof(int))).

+0

Dlaczego to działa, jeśli po prostu używam 'int * ptr;' '* ptr = 5;'? –

+0

Może "działać" lub może się zawiesić, w zależności od platformy, kompilatora, ustawień ... Tak czy inaczej, jest to niepoprawne. C jest niebezpiecznym językiem i nie sprawdza błędów pamięci, mogą one zostać niezauważone w twoim programie i uderzyć, gdy nie są oczekiwane. :) – Kos

+1

Dzięki! Nigdy wcześniej nie pracowałem z ręcznym językiem zarządzania pamięcią, więc jest to dla mnie zupełnie nowe. Na pewno o wiele więcej do przemyślenia. –

-1

Przed użyciem wskaźnik w C, trzeba albo ustawić wskaźnik do istniejącego bloku pamięci, trzeba przydzielić pamięci dla niego, jak to.

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

Oto odpowiedź na C:

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

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

Alternatywnie można za I i * linie przypisania PTR używać coś takiego:

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

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

Zauważmy też, że wyszła za darmo !!!

1

Użytkownik zadeklarował ptr, ale nic mu nie wskazuje. Potem próbowałeś napisać, do czego to wskazuje. To nigdy nie jest dobry pomysł. Spróbuj punkt ptr do i dodając linię

ptr = &i; 

przed próbą zapisu * ptr

Powiązane problemy