Apakah pointer yang menunjuk ke 0x0000 sama dengan pointer yang diatur ke NULL? Jika nilai NULL didefinisikan dalam bahasa C, maka lokasi apa yang diterjemahkan secara fisik? Apakah sama dengan 0x0000. Di mana saya dapat menemukan rincian lebih lanjut tentang konsep-konsep ini?
12
Jawaban:
Poin yang sebagian besar jawaban di sini tidak membahas, setidaknya tidak secara eksplisit, adalah bahwa null pointer adalah nilai yang ada selama eksekusi, dan konstanta null pointer adalah konstruk sintaksis yang ada dalam kode sumber C.
Sebuah nol pointer konstan , sebagai jawaban Karlson ini benar menyatakan, bisa berupa konstan ekspresi bilangan bulat dengan nilai 0 (sederhana
0
adalah contoh yang paling umum), atau seperti cor ekspresivoid*
(seperti(void*)0
).NULL
adalah makro, didefinisikan dalam<stddef.h>
dan beberapa header standar lainnya, yang meluas ke konstanta penunjuk nol yang ditentukan implementasi . Ekspansi biasanya salah satu0
atau((void*)0)
(tanda kurung luar diperlukan untuk memenuhi aturan bahasa lainnya).Jadi literal
0
, ketika digunakan dalam konteks yang membutuhkan ekspresi tipe pointer, selalu mengevaluasi kenull pointer
, yaitu nilai pointer unik yang menunjuk ke objek. Itu tidak menyiratkan apa pun tentang representasi dari pointer nol . Null pointer sangat umum direpresentasikan sebagai semua-bit-nol, tetapi mereka dapat direpresentasikan sebagai apa saja. Tetapi bahkan jika pointer nol direpresentasikan sebagai0xDEADBEEF
,0
atau(void*)0
masih merupakan pointer null konstan .Jawaban ini untuk pertanyaan pada stackoverflow mencakup ini dengan baik.
Ini menyiratkan, antara lain, bahwa
memset()
ataucalloc()
, yang dapat mengatur wilayah memori ke semua-bit-nol, tidak akan selalu menetapkan pointer apa pun di wilayah itu menjadi null pointer. Mereka cenderung melakukannya pada sebagian besar implementasi, tetapi bahasa tidak menjaminnya.Saya tidak tahu mengapa pertanyaan ini tidak dianggap sebagai duplikat dari pertanyaan ini , atau bagaimana topik ini di sini.
sumber
NULL
, atau sembarang pointer nol , ke objek pointer menetapkan nilai objek ke pointer nol . Pada level mesin, ini mungkin menunjuk ke sejumlah memori yang valid. Mendereferensi pointer nol memiliki perilaku yang tidak jelas; mengakses sepotong memori di alamat0x0000000
adalah perilaku yang valid, seperti yang lainnya secara harfiah. Alamat itu berbeda dari alamat lain dengan (a) membandingkan sama denganNULL
, dan (b) membandingkan tidak setara dengan sembarang pointer ke objek C. Null pointer adalah nilai pointer arbitrer yang digunakan untuk menunjukkan bahwa itu tidak menunjuk ke apa pun.Setiap platform di luar sana bebas menentukan NULL sesuka hati.
Menurut Standar C, jika Anda menetapkan nol ke pointer, itu akan dikonversi ke nilai NULL (untuk platform itu.) Namun, jika Anda mengambil pointer NULL dan melemparkannya ke int, tidak ada jaminan bahwa Anda akan mendapatkan nol di setiap platform di luar sana. Namun kenyataannya adalah bahwa pada kebanyakan platform itu akan menjadi nol.
Informasi tentang itu hal yang dapat Anda temukan di The C Language Specification . Satu sumber, kepercayaan yang tidak bisa saya percayai, adalah ini: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf
sumber
NULL pointer constant
. Sejauh yang saya tahu tidak ada kompiler di luar sana yang melakukan itu.NULL
makro, yang harus diperluas ke0
dalam C ++ dan salah satu0
atau(void *)0
dalam C, karena itu adalah "null pointer constant" yang sebenarnya.Ini didefinisikan dalam bahasa C karena tidak ada satu alamat mesin yang tidak sama yang disamakan. Jika ya, kita tidak perlu abstraksi darinya! Meskipun pada sebagian besar platform, NULL mungkin akhirnya diimplementasikan sebagai 0 dari beberapa jenis atau lainnya, itu salah untuk menganggap bahwa ini berlaku secara universal, jika Anda peduli tentang portabilitas sama sekali.
sumber
Menurut bagian Dokumen Standar C
6.3.2.3
:Sejauh ini saya belum melihat kompiler yang memisahkan diri dari ini.
sumber