Ketika kami memeriksa ukuran fungsi menggunakan sizeof()
, kami selalu mendapatkan 1 byte . Apa yang dimaksud dengan 1 byte ini?
Ketika kami memeriksa ukuran fungsi menggunakan sizeof()
, kami selalu mendapatkan 1 byte . Apa yang dimaksud dengan 1 byte ini?
Jawaban:
Ini adalah pelanggaran batasan, dan kompilator Anda harus mendiagnosisnya. Jika mengkompilasinya terlepas dari itu, program Anda memiliki perilaku yang tidak terdefinisi [terima kasih kepada @Steve Jessop untuk klarifikasi mode kegagalan, dan lihat jawaban @Michael Burr untuk mengapa beberapa kompiler mengizinkan ini]: Dari C11, 6.5.3.4./ 1:
The
sizeof
Operator tidak akan diterapkan pada ekspresi yang memiliki jenis fungsi
-std=c11
, bukan gnu11
. Ini adalah ekstensi kompiler yang sangat aneh.
sizeof(void)
1 di GNU C.
-std=c11
: seseorang harus merujuk -std=c*
opsi ke Standar Periklanan. Mereka tidak mengaktifkan mode kesesuaian, mereka hanya menonaktifkan ekstensi yang akan mencegah program yang terbentuk dengan baik dari kompilasi (seperti typeof
menjadi kata kunci, karena program C yang terbentuk dengan baik dapat menggunakannya sebagai nama variabel, tetapi gcc
secara default akan menolaknya. ). Selain itu, untuk menonaktifkan ekstensi yang memungkinkan program yang rusak lolos tidak terdiagnosis, Anda memerlukan -pedantic
atau -pedantic-errors
.
Ini bukan perilaku tidak terdefinisi - standar bahasa C memerlukan diagnostik saat menggunakan sizeof
operator dengan penunjuk fungsi (nama fungsi) karena ini merupakan pelanggaran batasan untuksizeof
operator.
Namun, sebagai ekstensi ke bahasa C, GCC memungkinkan aritmatika pada void
pointer dan pointer fungsi, yang dilakukan dengan memperlakukan ukuran a void
atau fungsi sebagai 1
. Akibatnya, sizeof
operator akan mengevaluasi ke 1
untuk void
atau fungsi dengan GCC. Lihat http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith
Anda bisa membuat GCC mengeluarkan peringatan saat menggunakan sizeof
dengan operand ini dengan menggunakan opsi -pedantic
atau -Wpointer-arith
ke GCC. Atau buat kesalahan dengan -Werror=pointer-arith
.
sizeof
fungsinya bukan UB (yang saya sebutkan cukup banyak hanya karena jawaban lain menyatakan itu UB). Tapi mungkin saya mengacaukannya karena cara saya menyusun kalimat. Agar lebih jelas. sizeof
fungsi bukan UB (seperti yang diklaim beberapa jawaban). Ini adalah pelanggaran batasan. Oleh karena itu, diperlukan diagnosis. GCC mengizinkannya sebagai ekstensi.
Ini menandakan bahwa penulis penyusun memutuskan nilai 1 daripada membuat setan terbang dari hidung Anda (memang, itu adalah penggunaan lain yang tidak ditentukan sizeof
yang memberi kita ungkapan: "kompiler C itu sendiri HARUS mengeluarkan diagnostik JIKA ini yang pertama diperlukan diagnostik yang dihasilkan dari program Anda, dan kemudian MUNGKIN itu sendiri menyebabkan setan terbang dari hidung Anda (yang, omong-omong, bisa menjadi pesan diagnostik yang terdokumentasi) sama seperti MUNGKIN mengeluarkan diagnostik lebih lanjut untuk pelanggaran lebih lanjut terhadap aturan atau batasan sintaksis (atau, dalam hal ini, untuk alasan apa pun yang dipilihnya). " https://groups.google.com/forum/?fromgroups=#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J
Dari sini ada istilah gaul "setan hidung" untuk apa pun yang diputuskan oleh penyusun untuk dilakukan sebagai respons terhadap konstruksi yang tidak ditentukan. 1
adalah setan hidung dari penyusun ini untuk kasus ini.
Seperti yang ditunjukkan orang lain, sizeof () dapat mengambil pengenal yang valid, tetapi itu tidak akan mengembalikan hasil yang valid (jujur benar dan valid) untuk nama fungsi. Selain itu, hal itu pasti mungkin, atau mungkin tidak, mengakibatkan sindrom "setan keluar dari hidung".
Jika Anda ingin membuat profil ukuran fungsi program Anda, periksa peta linker, yang dapat ditemukan di direktori hasil menengah (tempat hal-hal dikompilasi ke dalam .obj / .o atau tempat gambar / file yang dapat dieksekusi diletakkan). Kadang-kadang ada opsi untuk membuat atau tidak file peta ini ... itu bergantung pada compiler / linker.
Jika Anda menginginkan ukuran pointer ke suatu fungsi, semuanya berukuran sama, ukuran kata pengalamatan di cpu Anda.
int x = 1;
tetapi hanya satu dari yang diizinkan untuk kompilator yang memenuhi standar. Dengan sizeof()
diterapkan ke suatu fungsi, itu mungkin atau mungkin tidak mengembalikan nilai yang ditetapkan, atau menolak untuk dikompilasi, atau mengembalikan nilai acak berdasarkan apa pun yang ada di register tertentu pada saat itu. Setan hidung harfiah tidak mungkin, tetapi dalam huruf standar.
sizeof
ke penunjuk ke suatu fungsi.
-pedantic
), Anda memiliki kompilator yang tidak sesuai dan setiap program memiliki perilaku yang tidak ditentukan.