Bir fonksiyonun boyutunu kullanarak kontrol sizeof()
ettiğimizde, her zaman 1 bayt elde ederiz . Bu 1 bayt ne anlama geliyor?
Bir fonksiyonun boyutunu kullanarak kontrol sizeof()
ettiğimizde, her zaman 1 bayt elde ederiz . Bu 1 bayt ne anlama geliyor?
Yanıtlar:
Bu bir kısıtlama ihlalidir ve derleyiciniz bunu teşhis etmelidir . Buna rağmen derlerse, programınız tanımsız davranışa sahiptir [hata kipinin açıklığa kavuşturulması için @Steve Jessop'a teşekkürler ve bazı derleyicilerin buna neden izin verdiğine dair @ Michael Burr'un cevabına bakın]: C11'den , 6.5.3.4./ 1:
sizeof
Operatör fonksiyon türüne sahip bir ifadesine uygulanabilir değildir
-std=c11
, değil gnu11
. Bu gerçekten tuhaf bir derleyici uzantısı.
sizeof(void)
, GNU C'de 1 olanla aynı şekilde
-std=c11
: birisi -std=c*
seçeneklere Reklam Standartları'na başvurmalıdır . Uyumluluk modunu etkinleştirmezler, yalnızca iyi biçimlendirilmiş bir programın derlenmesini engelleyen uzantıları devre dışı bırakırlar (örneğin typeof
, iyi biçimlendirilmiş bir C programı onu bir değişken adı olarak kullanabilir, ancak gcc
varsayılan olarak bunu reddeder) ). Ek olarak, kötü biçimlendirilmiş programların teşhis edilmeden geçmesine izin veren uzantıları devre dışı bırakmak için, -pedantic
veya -pedantic-errors
.
Bu tanımsız bir davranış değildir - C dili standardı, sizeof
operatör için bir kısıtlama ihlali olduğundan, operatör bir işlev belirleyiciyle (bir işlev adı) kullanıldığında bir tanı gerektirir sizeof
.
Bununla birlikte, C dilinin bir uzantısı olarak, GCC void
, a void
veya bir işlevin boyutuna göre yapılan, işaretçiler ve işlev işaretçileri üzerinde aritmetiğe izin verir 1
. Sonuç olarak, sizeof
operatör için değerlendirecek 1
için void
veya GCC ile bir işlev. Bkz. Http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith
GCC'nin veya seçeneklerini kullanarak GCC'nin sizeof
bu işlenenlerle kullanırken bir uyarı vermesini sağlayabilirsiniz . Veya ile bir hata yapın .-pedantic
-Wpointer-arith
-Werror=pointer-arith
sizeof
Bir işlevin UB olmaması dışında UB hakkında pek bir şey ifade etmedim (sadece diğer yanıtların UB olduğunu söylediği için hemen hemen bahsetmiştim). Ama belki de cümleyi kurgulama şeklim yüzünden bunu karıştırdım. Daha net olmak için. sizeof
bir işlev UB değildir (birkaç yanıtın iddia ettiği gibi). Bu bir kısıtlama ihlalidir. Bu nedenle, bir teşhis gerektirir. GCC, bir uzantı olarak izin verir.
Bu, derleyicinin yazarının, iblisleri burnunuzdan uçurmak yerine 1 değerine karar verdiğini gösterir (aslında, sizeof
bize bu ifadenin tanımlanmamış başka bir kullanımıydı : "C derleyicisinin kendisi bir tanı koyması GEREKİRSE bu ilk gerekliyse programınızdan kaynaklanan teşhis ve daha sonra kendisi iblislerin burnunuzdan uçmasına neden olabilir (ki bu bu arada belgelenmiş teşhis mesajı olabilir), sözdizimi kurallarının veya kısıtlamalarının daha fazla ihlali için daha fazla teşhis sunabilir (veya bu nedenle, seçtiği herhangi bir nedenle). " https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J
Bundan, bir derleyicinin tanımlanmamış bir yapıya yanıt olarak yapmaya karar verdiği şey için kullanılan argo terim "nazal iblisler" var. 1
bu durum için bu derleyicinin nazal iblisidir.
Diğerlerinin de belirttiği gibi, sizeof () herhangi bir geçerli tanımlayıcı alabilir, ancak işlev adları için geçerli (dürüstçe doğru ve geçerli) bir sonuç döndürmez. Dahası, kesinlikle "burundan iblisler" sendromuna neden olabilir veya olmayabilir.
Program işlev boyutunuzun profilini çıkarmak istiyorsanız, ara sonuç dizininde (şeylerin .obj / .o olarak derlendiği veya elde edilen görüntünün / yürütülebilir dosyanın bulunduğu yer) bulunabilen bağlayıcı haritasını kontrol edin. Bazen bu harita dosyasını oluşturup oluşturmama seçeneği vardır ... derleyiciye / bağlayıcıya bağlıdır.
Bir işleve bir işaretçi boyutunu istiyorsanız, hepsi aynı boyuttadır, işlemcinizdeki adresleme kelimesinin boyutundadır.
int x = 1;
ancak standartlara uyumlu bir derleyici için bunlardan yalnızca birine izin verilir. İle sizeof()
bir işleve uygulanmakta olan, bu ya bir dizi değer döndürmek veya derlemeye reddeder veya sırasında belirli bir kayıtta ne varsa dayanan rasgele bir değer döndürmek veya olmayabilir. Basit burun iblisleri olası değildir, ancak standardın lafzı dahilindedir.
sizeof
işaretçisine uygulayın.
-pedantic
), uyumsuz bir derleyiciniz vardır ve her programın tanımsız davranışı vardır.