2013-05-31 17 views
8

Ben C kod parçası vardır:Bu form neden C'de doğrudur?

void f(void *x) { 
    printf(">>> %p\n", x); 
} 

int main() { 

    f NULL; 
    return 0; 
} 

Ben NULL tanımı için olduğunu düşünüyorum, ama benim şüphe netleştirmek için bir açıklama bekliyorum. NULL((void *)0) veya (0) olarak tanımlanırsa

+0

tam olarak burada ne sevmiyorsunuz? –

+5

iirc NULL bir # define'd to ((void *) 0) 'dır, bu yüzden içinde kopyaladığınız zaman f ((void *) 0)' a sahip olur. Bu, – Daboyzuk

+0

işlevinin ilk parametresi olarak işlev görür. tür f formu. – Kyrol

cevap

9

, o zaman bu, uygun fonksiyon aramalar f ((void *)0) veya f (0), genişler. Kod derleme sırasında parantez içinde olmayan herhangi bir şey için hata verir. aşağıdaki gibi C NULL yılında

+0

'u anlarım, ve "pazartesi sabahı" anı olduğunu farkettikten sonra downvote'umu kaldırırsın ... –

+0

@ JohannesSchaub-litb Ah, OK. Anlıyorum. –

+0

Açıklama için çok teşekkürler. – Kyrol

2

sıklıkla tanımlanır:

#if !defined(NULL) 
    #define NULL ((void*)0) 
#endif 

bu durumda NULL sadece özel bir işaretçi olduğunu ve örnek işler sonra ise.

+0

Hayır, C standardı NULL tanımlanmalıdır tanımlamıyor. –

+5

Ayrıca, 'NULL', 0 * adresine bir * işaretçi değildir. Daha ziyade, bir işaretçi bağlamında karşılaşıldığında * literal değer 0 *, boş göstericidir. Boş göstericinin * gerçek * değeri uygulamaya özgüdür ve herhangi bir şey olabilir. – Jon

+2

Yeterince adil, standart NULL tanımının uygulamaya özgü olduğunu söylüyor. Ancak bölüm 6.3.2.3 bölüm 3, http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf. "0" (void *) 'a atıldığına, boş bir işaretçi sabiti denir. – jbr

İlgili konular