2016-03-18 23 views
1

Şu anda bir işaretçiyi bir gösterici olarak scanf içine iletmeye çalıştığım bir C programı üzerinde çalışıyorum.C programlamada bir scanf argümanına bir işaretçi gösterebilir mi?

Örnek:

int main() { 
    int *num; 
    scanf("%d", num); 
    printf("%d", *num); 
} 

bir adres tipik scanf geçer bir işaretçi tutan adresi depolayamazsınız neden bkz olmayan bir değeri saklamak için göz önüne alındığında. Bu kod bloğunu çalıştırmayı denediğimde bir bellek hatası alıyorum. Sorun ne olabilir?

+2

ben "adam scanf" öneriyoruz. Cevabı oldukça sade bulmalısın. –

+1

Lütfen açıklayınız ** hangi ** adresi tutuyor! – Olaf

+1

Bir işaretçiyi işaret etmek, onu başlatmayı unutmanız dışında iyidir. 'num' undefined, yani 'scanf' için rastgele, bilinmeyen bir işaretçi değerini geçiyorsunuz. Sadece 'num' değerini değer için kullanmak istediğiniz int 'değişkeninin adresine başlatalım ve sonra işe yarayacaktır. Sadece int int; gibi bir şey bildirin ve sonra 'num' değerini başlatmak için num = &val; 'atayın. –

cevap

8

Bunu yalnızca num geçerli belleğe işaret ediyorsa yapabilirsiniz.


// OK 
int* num = malloc(sizeof(*num)); 
scanf("%d",num); 
// Not OK 
// Leads to undefined behavior since num does not point 
// to anything valid. 
int* num; 
scanf("%d",num); 


// Also OK 
int i; 
int* num = &i; 
scanf("%d",num); 
+0

Deklanatöre dilin niyetini, yani yanıltıcı olan int * i 'yi değil, int * i'yi ifade etmenin daha iyi bir stil olduğunu düşünüyorum. int * 'sözdizimsel bir tür değil. Daha ziyade, bir tür ve bir deklaratörün bir parçasıdır, ikincisi aşağıdakilere daha sıkı bir şekilde bağlanacaktır ve takip edebilecek herhangi bir ek değişkene uygulanamaz. –

+0

Niçin numunes çöp belleğine işaret edemiyor? Sonuçta hala bir adres. – Bwoods

+0

Çöp belleğine işaret edebilir. Ancak, genellikle * işleminize bile tahsis edilmemiş olan belleğe işaret eder ve bu yüzden çalıştırdığınızda hatayı alırsınız. –

İlgili konular