0x0000'ü gösteren bir işaretçi NULL olarak ayarlanmış bir işaretçi ile aynı mı? C dilinde NULL değeri tanımlanmışsa, fiziksel olarak hangi konuma çevrilir? 0x0000 ile aynı mı? Bu kavramlar hakkında daha fazla bilgiyi nerede bulabilirim?
0x0000'ü gösteren bir işaretçi NULL olarak ayarlanmış bir işaretçi ile aynı mı? C dilinde NULL değeri tanımlanmışsa, fiziksel olarak hangi konuma çevrilir? 0x0000 ile aynı mı? Bu kavramlar hakkında daha fazla bilgiyi nerede bulabilirim?
Yanıtlar:
Buradaki cevapların çoğunun, en azından açıkça değil, ele almadığı bir nokta, boş gösterici yürütme sırasında var olan bir değerdir ve boş gösterici sabiti , C kaynak kodunda bulunan sözdizimsel bir yapıdır.
Bir boş gösterici sabit Karlson cevabı doğru ifade ettiği gibi, ya 0 değerine (basit bir sabit ifadesidir 0
en yaygın örnek) ya da bu tür bir ekspresyon döküm void*
(örneğin (void*)0
).
NULL
, <stddef.h>
uygulama tarafından tanımlanan bir boş işaretçi sabitine genişleyen bir makro ve diğer birçok standart üstbilgidir . Genişletme tipik olarak ya 0
da ((void*)0)
(diğer dil kurallarını karşılamak için dış parantez gereklidir).
Dolayısıyla, bir değişmez 0
, işaretçi türünün ifadesini gerektiren bir bağlamda kullanıldığında, her zaman bir null pointer
nesneye işaret etmeyen benzersiz bir işaretçi değeri olarak değerlendirilir . Yani yok değil bir temsili hakkında bir şey ima null işaretçi . Boş göstergeler çok sık olarak sıfır biti olarak temsil edilir, ancak herhangi bir şey olarak temsil edilebilirler. Ancak bir boş gösterici olarak temsil edilir olsa bile 0xDEADBEEF
, 0
ya da (void*)0
yine bir olan boş işaretçisi sabiti .
Stackoverflow hakkındaki soruya verilen bu cevap bu konuyu çok iyi kapsamaktadır.
Bu, diğer şeylerin yanı sıra, memset()
veya calloc()
bir bellek bölgesini all-bit-sıfıra ayarlayabilen, o bölgedeki hiçbir işaretçiyi boş göstericilere ayarlamayacaktır. Çoğu uygulamada bunu yaparlar, ancak dil bunu garanti etmez.
Bu soru kopyası kabul edilmez neden bilmiyorum bu bir , ya da burada topikal var nasıl.
NULL
herhangi bir boş işaretçi sabiti atama veya bu nesnenin değerini boş bir işaretleyiciye ayarlar . Makine düzeyinde, geçerli bir bellek belleğine işaret edebilir. Boş bir işaretçinin kaydı silindiğinde tanımlanmamış davranış var; adresten bir bellek yığınına erişmek 0x0000000
, tam anlamıyla başka bir şey gibi geçerli bir davranıştır. Bu adres, diğer herhangi bir adresten farklıdır (a) eşittir NULL
ve (b) eşitsiz bir işaretçi ile bir C nesnesini karşılaştırarak. Boş gösterici, hiçbir şeye işaret etmediğini belirtmek için kullanılan rastgele bir işaretçi değeridir.
Dışarıdaki her platform NULL'u istediği gibi tanımlamakta serbesttir.
C Standardına göre, bir işaretçiye sıfır atarsanız, bir NULL değerine dönüştürülür (bu platform için.) Ancak, bir NULL işaretçisi alıp int'e çevirirseniz, sıfır alacağınızın garantisi yoktur. her platformda. Ancak gerçek şu ki çoğu platformda sıfır olacak.
C Dil Şartnamesi'nde bulabileceğiniz şeyler hakkında bilgi . Güvenilirliğini garanti edemediğim bir kaynak şudur: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf
NULL pointer constant
. Bildiğim kadarıyla orada bunu yapan hiçbir derleyici yoktur.
NULL
genişletmek için olan makro 0
C ++ ve her iki 0
ya da (void *)0
C, çünkü bu gerçek "boş işaretçi sabiti" dir.
C dilinde tanımlanmıştır, çünkü eşit olduğu tek bir makine adresi yoktur. Olsaydı, ondan bir soyutlamaya ihtiyacımız olmazdı! Çoğu platformda, NULL sonunda bir tür veya başka bir 0 olarak uygulanabilir, ancak taşınabilirliği önemsiyorsanız bunun evrensel olarak olduğunu varsaymak yanlıştır.
Göre Cı Standart Belge bölümünde 6.3.2.3
:
0 değerine sahip bir tamsayı sabit ifadesine veya void * türüne atanan böyle bir ifadeye boş işaretçi sabiti denir.55) Boş bir işaretçi sabiti bir işaretçi türüne dönüştürülürse, sonuçtaki işaretçi boş işaretçi olarak adlandırılır. bir işaretçiye eşit olmayan herhangi bir nesne veya işlevin karşılaştırılması garanti edilir.
Şimdiye kadar bundan kopmuş bir derleyici görmedim.