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
sizeofOperator 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 typeofmenjadi kata kunci, karena program C yang terbentuk dengan baik dapat menggunakannya sebagai nama variabel, tetapi gccsecara default akan menolaknya. ). Selain itu, untuk menonaktifkan ekstensi yang memungkinkan program yang rusak lolos tidak terdiagnosis, Anda memerlukan -pedanticatau -pedantic-errors.
Ini bukan perilaku tidak terdefinisi - standar bahasa C memerlukan diagnostik saat menggunakan sizeofoperator dengan penunjuk fungsi (nama fungsi) karena ini merupakan pelanggaran batasan untuksizeof operator.
Namun, sebagai ekstensi ke bahasa C, GCC memungkinkan aritmatika pada voidpointer dan pointer fungsi, yang dilakukan dengan memperlakukan ukuran a voidatau fungsi sebagai 1. Akibatnya, sizeofoperator akan mengevaluasi ke 1untuk voidatau fungsi dengan GCC. Lihat http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html#Pointer-Arith
Anda bisa membuat GCC mengeluarkan peringatan saat menggunakan sizeofdengan operand ini dengan menggunakan opsi -pedanticatau -Wpointer-arithke GCC. Atau buat kesalahan dengan -Werror=pointer-arith.
sizeoffungsinya 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. sizeoffungsi 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 sizeofyang 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. 1adalah 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.
sizeofke penunjuk ke suatu fungsi.
-pedantic), Anda memiliki kompilator yang tidak sesuai dan setiap program memiliki perilaku yang tidak ditentukan.