( Harap Baca Paragraf Ini Sebelum Membaca Posting.Saya meminta siapa pun yang tertarik membaca posting ini harus mencoba membacanya dengan cermat, dan tentu saja jangan downvote sampai Anda memahaminya sepenuhnya, terima kasih. )
Sekarang menjadi wiki komunitas, dengan demikian jika seseorang tidak setuju dengan salah satu konsep, harap memodifikasinya, dengan penjelasan yang jelas dan terperinci tentang apa yang salah dan mengapa, dan jika mungkin kutip sumber atau berikan bukti yang dapat direproduksi.
Menjawab
Berikut adalah beberapa alasan lain yang mungkin menjadi faktor yang mendasari NULL == 0
- Fakta bahwa nol adalah salah, jadi seseorang dapat melakukan secara langsung
if(!my_ptr)
daripadaif(my_ptr==NULL)
.
- Fakta bahwa bilangan bulat global yang belum diinisiasi diinisialisasi secara default ke semua nol, dan dengan demikian penunjuk dari semua nol akan dianggap tidak diinisialisasi.
Di Sini Saya Ingin Mengatakan Sepatah Kata Tentang Jawaban Lain
Bukan Karena Gula Sintaksis
Mengatakan bahwa NULL adalah nol karena gula sintaksis, tidak terlalu masuk akal, jika demikian mengapa tidak menggunakan indeks 0 dari sebuah array untuk menahan panjangnya?
Sebenarnya C adalah bahasa yang paling mirip dengan implementasi internal, apakah masuk akal untuk mengatakan bahwa C memilih nol hanya karena gula sintaksis? Mereka lebih suka memberikan kata kunci null (seperti yang dilakukan banyak bahasa lain) daripada memetakan nol ke NULL!
Karena saat ini mungkin hanya gula sintaksis, jelas bahwa maksud asli dari pengembang bahasa C bukanlah untuk gula sintaksis, seperti yang akan saya tunjukkan lebih lanjut.
1) Spesifikasi
Namun meskipun benar bahwa spesifikasi C berbicara dari konstanta 0 sebagai penunjuk nol (bagian 6.3.2.3), dan juga mendefinisikan NULL sebagai implementasi yang ditentukan (bagian 7.19 dalam spesifikasi C11, dan 7.17 dalam spesifikasi C99), Faktanya tetap bahwa dalam buku "The C Programming Language" yang ditulis oleh penemu C berikut ini dinyatakan dalam bagian 5.4:
C menjamin bahwa nol tidak pernah menjadi alamat yang valid untuk data, sehingga nilai kembali nol dapat digunakan untuk menandakan peristiwa abnormal, dalam hal ini, tidak ada spasi.
Pointer dan integer tidak dapat dipertukarkan, Nol adalah satu-satunya pengecualian: nol konstan dapat diberikan ke pointer, dan pointer dapat dibandingkan dengan nol konstan. Konstanta simbolik NULL sering digunakan di tempat nol, sebagai mnemonik untuk menunjukkan dengan lebih jelas bahwa ini adalah nilai khusus untuk sebuah pointer. NULL didefinisikan dalam. Kami akan menggunakan NULL untuk selanjutnya.
Seperti yang dapat dilihat (dari kata-kata "alamat nol") setidaknya maksud asli dari penulis C adalah alamat nol, dan bukan nol konstan, selain itu tampak dari kutipan ini bahwa alasan mengapa spesifikasi berbicara dari konstanta nol mungkin tidak mengecualikan ekspresi yang mengevaluasi ke nol, tetapi menyertakan konstanta bilangan bulat nol menjadi satu-satunya konstanta bilangan bulat yang diizinkan untuk digunakan dalam konteks penunjuk tanpa casting.
2) Ringkasan
Meskipun spesifikasi tidak mengatakan secara eksplisit bahwa alamat nol dapat diperlakukan berbeda dari konstanta nol, ia tidak mengatakan bahwa tidak, dan faktanya ketika berurusan dengan konstanta penunjuk-nol itu tidak mengklaimnya sebagai implementasi yang didefinisikan seperti itu dilakukan oleh konstanta yang ditentukan NULL , alih-alih mengklaimnya sebagai nol, menunjukkan bahwa mungkin ada perbedaan antara konstanta nol dan alamat nol.
(Namun jika ini kasusnya saya hanya bertanya-tanya mengapa NULL adalah implementasi yang ditentukan, karena dalam kasus seperti itu NULL juga bisa menjadi nol konstan, karena kompiler tetap harus mengubah semua konstanta nol menjadi implementasi aktual yang ditentukan NULL?)
Namun saya tidak melihat ini dalam tindakan nyata, dan dalam platform umum alamat nol dan nol konstan diperlakukan sama, dan menampilkan pesan kesalahan yang sama.
Selain itu, faktanya adalah bahwa sistem operasi saat ini sebenarnya menyimpan seluruh halaman pertama (kisaran 0x0000 hingga 0xFFFF), hanya untuk mencegah akses ke alamat nol karena penunjuk C's NULL, (lihat http://en.wikipedia.org/wiki/ Zero_page , serta "Windows Via C / C ++ oleh Jeffrey Richter dan Christophe Nasarre (diterbitkan oleh Microsoft Press)").
Jadi saya akan meminta dari siapa pun yang mengaku benar-benar melihatnya beraksi, untuk menentukan platform, dan kompiler, dan kode persis yang sebenarnya dia lakukan, (meskipun karena definisi yang tidak jelas dalam spesifikasi [seperti yang telah saya tunjukkan] kompiler apa pun dan platform bebas untuk melakukan apapun yang dia inginkan).
Namun tampaknya penulis C tidak memikirkan hal ini, dan mereka berbicara tentang "alamat nol", dan bahwa "C menjamin bahwa itu tidak pernah menjadi alamat yang valid", serta "NULL hanyalah a mnemonic ", dengan jelas menunjukkan bahwa niat aslinya bukanlah untuk" gula sintaksis ".
Bukan Karena Sistem Operasi
Juga mengklaim bahwa sistem operasi menolak akses ke alamat nol, karena beberapa alasan:
1) Ketika C ditulis tidak ada batasan seperti itu, seperti yang bisa dilihat di wikipage ini http://en.wikipedia.org/wiki/Zero_page .
2) Faktanya adalah bahwa kompiler C tidak mengakses alamat memori nol.
Ini tampaknya fakta dari makalah berikut oleh BellLabs ( http://www.cs.bell-labs.com/who/dmr/primevalC.html )
Kedua penyusun berbeda dalam detail cara mereka mengatasinya. Di awal, awal ditemukan dengan menamai fungsi; di kemudian hari, awal hanya dianggap 0. Ini menunjukkan bahwa kompilator pertama ditulis sebelum kita memiliki mesin dengan pemetaan memori, jadi program asal tidak berada di lokasi 0, sedangkan pada saat yang kedua, kami memiliki PDP-11 yang menyediakan pemetaan.
(Faktanya pada hari ini (seperti yang saya kutip referensi di atas dari wikipedia dan microsoft press), alasan untuk membatasi akses ke alamat nol adalah karena petunjuk C's NULL! Jadi pada akhirnya ternyata sebaliknya!)
3) Ingatlah bahwa C juga digunakan untuk menulis sistem operasi, dan bahkan C compiler!
Faktanya C dikembangkan untuk tujuan menulis sistem operasi UNIX dengannya, dan karena itu tampaknya tidak ada alasan mengapa mereka harus membatasi diri dari alamat nol.
(Hardware) Penjelasan Tentang Bagaimana Komputer (Secara Fisik) Mampu Mengakses Alamat Nol
Ada hal lain yang ingin saya jelaskan di sini, bagaimana mungkin merujuk alamat nol sama sekali?
Pikirkan sejenak, alamat diambil oleh prosesor, dan kemudian dikirim sebagai tegangan pada bus memori, yang kemudian digunakan oleh sistem memori untuk sampai ke alamat sebenarnya, namun alamat nol berarti tidak ada tegangan. , jadi bagaimana perangkat keras fisik dari sistem memori mengakses alamat nol?
Jawabannya adalah, bahwa alamat nol adalah default, dan dengan kata lain alamat nol selalu dapat diakses oleh sistem memori ketika bus memori benar-benar mati, dan dengan demikian setiap permintaan untuk membaca atau menulis tanpa menentukan alamat sebenarnya (yang mana adalah kasus dengan alamat nol) secara otomatis mengakses alamat nol.
if (p != 0)
keif (p)
yang merupakan idiom umum di C dan C ++, meskipun Anda harus keluar dari kebiasaan jika Anda mengambil Java.