2012-07-02 25 views
13

olası Kopyaları değerleri atayamıyorum:
Segmentation Fault when attempting to print value in Cdeğişken ve pointer

Ben C'ye çok yeniyim ama hiçbir fikri neden bu program sonları var. Program, i ile ilgisi olan satırları silersem, derler ve çalışır, ancak i'u atarsam, program kırılması olmadan *ptr'a hiçbir şey atayamam.

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

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

[Bu] (http://stackoverflow.com/questions/11278085/segmentation-fault-when- yazmaya çalışmadan önce hattını

ptr = &i; 

ekleyerek i için ptr noktasını oluşturmayı deneyin doldurulan baskı-değeri-in-c) hemen hemen _identical_ soru sadece dün istendi. – pb2q

+0

Sorun, bir işaretçi oluşturduğunuz, ancak işaret edecek bir şey vermediğinizdir. Yeni kullanarak bir miktar bellek atayabilir veya i gibi bir değişkene yönlendirebilirsiniz. – jlunavtgrad

cevap

11

İşaretçiyi başlatılmamış değeriyle bırakırsınız. Bu nedenle, (*ptr) tercih ettiğinizde, bellekte rastgele bir yere erişirsiniz ve bir segmentasyon hatasıyla sonuçlanır. ptr kendisinin (*ptr) bir değişkenin bir adres (gibi &i) ya da taze ayrılan bellek (gibi malloc(sizeof(int))) atayarak şeye

Noktası ptr.

+0

Neden 'int * ptr;' '* ptr = 5;'? Kullanırsam neden çalışır? –

+0

Platformunuza, derleyicinize, ayarlarınıza bağlı olarak "işe yarayabilir" veya çökebilir. Her iki durumda da yanlıştır. C güvensiz bir dildir ve bellek hatalarını kontrol etmez, programınızda fark edilmeyebilir ve beklenmediğinde grev yapabilir. :) – Kos

+1

Teşekkürler! Daha önce manuel bellek yönetimi dili ile çalışmadım, bu yüzden bu benim için tamamen yeni. Kesinlikle düşünmek için çok daha fazla. –

-1

C bir işaretçi kullanmadan önce, bellek mevcut bir bloğa işaretçi ayarlamak yapmalı ya, böyle, bunun için bellek ayrılamadı gerekir.

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

İşte C cevabı:

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

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

Alternatif i için ve * ptr atama hatları gibi bir şey kullanabilirsiniz: ücretsiz çıktı da o

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

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

Uyarı !!!

1

ptr'yi beyan ettiniz, ancak herhangi bir şeye işaret etmediniz. Sonra ne yazdığını yazmaya çalıştın. Bu asla iyi bir fikir değildir. Eğer * ptr