Rumah >pembangunan bahagian belakang >C++ >Adakah Penyahrujukan Penunjuk Tidak Dimulakan dalam Kelakuan Tidak Ditakrifkan C?

Adakah Penyahrujukan Penunjuk Tidak Dimulakan dalam Kelakuan Tidak Ditakrifkan C?

Susan Sarandon
Susan Sarandonasal
2024-12-14 14:52:16612semak imbas

Is Dereferencing an Uninitialized Pointer in C   Undefined Behavior?

Tingkah Laku Tidak Ditakrifkan: Menyahrujuk Penunjuk Tidak Dimulakan dalam C

Titik kekeliruan biasa dalam C ialah memahami apabila membatalkan rujukan penunjuk tidak dimulakan membentuk tingkah laku tidak ditentukan (UB). Walaupun piawaian C mengandungi banyak peraturan, ia boleh mencabar untuk mencari peruntukan tepat yang mentakrifkan gelagat ini.

Coretan kod yang dimaksudkan:

int* ptr;
*ptr = 0;

menimbulkan persoalan sama ada menolak rujukan ptr menuju ke UB. Untuk menjelaskan perkara ini, kami akan menyelidiki bahagian berkaitan piawaian C.

Peruntukan Standard

Bahagian 4.1 piawaian memberikan pandangan yang penting. Ia menyatakan bahawa:

"Jika objek yang dirujuk nilai l bukan objek jenis T dan bukan objek jenis yang diperoleh daripada T, atau jika objek tidak dimulakan, program yang memerlukan ini penukaran mempunyai gelagat yang tidak ditentukan."

Dalam kes kami, ptr ialah penunjuk yang tidak dimulakan kepada integer. Oleh itu, percubaan untuk menyahrujuknya tanpa memulakannya terlebih dahulu berada di bawah syarat yang diterangkan dalam Bahagian 4.1 dan mengakibatkan UB.

Seksyen 3.7.3.2/4, sering disebut berkaitan dengan UB, tidak terpakai secara langsung pada kod coretan yang dipersoalkan kerana ia berkaitan dengan menggunakan fungsi deallocation pada penunjuk bukan nol.

Tambahan Sumber

Mencari "uninitial" dalam standard boleh mendedahkan bahagian lain yang berkaitan, seperti 8.5.1, yang menjelaskan lagi peraturan untuk mengakses objek yang tidak diinisialisasi.

Atas ialah kandungan terperinci Adakah Penyahrujukan Penunjuk Tidak Dimulakan dalam Kelakuan Tidak Ditakrifkan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn