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_ptr
nilai 2. Karena my_int_ptr
diisi 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_ptr
adalah variabel (tipe pointer ke int
), ia memiliki alamat sendiri (tipe: alamat pointer ke integer), Anda menyimpan nilai 2
ke dalam yang alamat.
Sekarang, my_int_ptr
sebagai 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 x
ke 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,
2
memiliki 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;
.