Apakah mungkin untuk menginisialisasi pointer C ke NULL?
TL; DR Ya, sangat banyak.
The klaim yang sebenarnya dibuat pada panduan dibaca seperti
Di sisi lain, jika Anda hanya menggunakan satu tugas awal, int *my_int_ptr = 2;program akan mencoba untuk mengisi isi dari lokasi memori yang ditunjuk oleh my_int_ptrnilai 2. Karena my_int_ptrdiisi dengan sampah, itu bisa alamat apapun. [...]
Yah, mereka adalah salah, Anda benar.
Untuk pernyataan, ( mengabaikan, untuk saat ini, fakta bahwa penunjuk ke konversi integer adalah perilaku yang ditentukan implementasi )
int * my_int_ptr = 2;
my_int_ptradalah variabel (tipe pointer ke int), ia memiliki alamat sendiri (tipe: alamat pointer ke integer), Anda menyimpan nilai 2ke dalam yang alamat.
Sekarang, my_int_ptrsebagai tipe penunjuk, bisa kita katakan, ini menunjuk ke nilai "type" di lokasi memori yang ditunjukkan oleh nilai yang dipegang my_int_ptr. Jadi, Anda pada dasarnya menempatkan nilai dari variabel pointer, bukan nilai dari lokasi memori yang ditunjuk oleh pointer.
Jadi, sebagai kesimpulan
char *x=NULL;
menginisialisasi variabel pointer xke NULL, bukan nilai di alamat memori yang ditunjukkan oleh pointer .
Ini sama dengan
char *x;
x = NULL;
Ekspansi:
Sekarang, menjadi benar-benar sesuai, pernyataan seperti
int * my_int_ptr = 2;
ilegal, karena melibatkan pelanggaran batasan. Untuk lebih jelasnya,
my_int_ptr adalah variabel penunjuk, ketik int *
- konstanta integer,
2memiliki tipe int, menurut definisi.
dan mereka bukan tipe yang "kompatibel", jadi inisialisasi ini tidak valid karena melanggar aturan penetapan sederhana, yang disebutkan dalam bab §6.5.16.1 / P1, yang dijelaskan dalam jawaban Lundin .
Jika ada yang tertarik bagaimana inisialisasi dihubungkan dengan batasan tugas sederhana, kutipan C11, bab §6.7.9, P11
Penginisialisasi untuk skalar harus berupa ekspresi tunggal, secara opsional diapit oleh tanda kurung. Nilai awal objek adalah ekspresi (setelah konversi); batasan jenis dan konversi yang sama seperti untuk penetapan sederhana berlaku, menjadikan jenis skalar sebagai versi yang tidak memenuhi syarat dari jenis yang dideklarasikan.
int *x = whatever;dilakukan dan apa yangint *x; *x = whatever;dilakukannya.int *x = whatever;sebenarnya berperilaku sepertiint *x; x = whatever;, tidak*x = whatever;.