Rumah > pembangunan bahagian belakang > C++ > Mengapakah Mengubah Suai Pembolehubah `const` Melalui Penunjuk Jenis Berbeza Membawa kepada Gelagat Tidak Ditakrifkan dalam C ?

Mengapakah Mengubah Suai Pembolehubah `const` Melalui Penunjuk Jenis Berbeza Membawa kepada Gelagat Tidak Ditakrifkan dalam C ?

Susan Sarandon
Lepaskan: 2024-12-08 16:21:10
asal
493 orang telah melayarinya

Why Does Modifying a `const` Variable Through a Pointer of a Different Type Lead to Undefined Behavior in C  ?

Nilai Perubahan Pembolehubah pada Alamat Yang Sama: Memahami Gelagat Tidak Ditakrifkan

Dalam C , pembolehubah dengan jenis data yang berbeza boleh menduduki alamat memori yang sama, membawa kepada hasil yang tidak dijangka. Pertimbangkan kod berikut:

const int a1 = 40;
const int* b1 = &a1;
char* c1 = (char *)(b1);
*c1 = 'A';
int *t = (int*)c1;

cout << a1 << " " << *t << endl;
cout << &a1 << " " << t << endl;
Salin selepas log masuk

Selepas menjalankan kod ini, anda mungkin menjangkakan kedua-dua a1 dan *t mempunyai nilai 40 serta &a1 dan t mempunyai alamat yang sama. Walau bagaimanapun, outputnya mengejutkan:

40 65 
0xbfacbe8c 0xbfacbe8c
Salin selepas log masuk

Bagaimana mungkin pembolehubah pada alamat yang sama menghasilkan dua nilai yang berbeza?

Penjelasan

Tingkah laku ini berlaku disebabkan oleh tingkah laku yang tidak ditentukan dalam kod. Khususnya, mengubah suai pembolehubah const seperti a1 ialah tingkah laku yang tidak ditentukan. Piawaian C (bahagian 7.1.6.1) secara eksplisit menyatakan bahawa sebarang percubaan untuk mengubah suai objek const semasa hayatnya menghasilkan tingkah laku yang tidak ditentukan.

Dalam kes ini, dengan mengubah suai *c1 (yang menunjuk kepada a1), kita mempunyai mengubah suai pembolehubah const dengan berkesan. Inilah sebabnya mengapa pengkompil tidak dapat menjamin kelakuan yang dijangkakan, dan sebaliknya menghasilkan hasil yang tidak dapat diramalkan.

Kelakuan yang mungkin dalam kes sedemikian dinyatakan dalam bahagian 1.3.24 standard. Ini terdiri daripada mengabaikan situasi sepenuhnya kepada menamatkan program dengan mesej ralat. Dalam kes ini, pengkompil telah memilih untuk menghasilkan nilai yang berbeza untuk a1 dan *t.

Kesimpulan

Tingkah laku yang tidak ditentukan harus dielakkan dalam kod C, kerana ia boleh membawa kepada keputusan yang tidak dijangka dan tidak konsisten. Dalam senario khusus ini, mengakses pembolehubah const melalui penuding jenis berbeza dan mengubah suainya telah menghasilkan gelagat yang tidak ditentukan dan output yang tidak dapat diramalkan.

Atas ialah kandungan terperinci Mengapakah Mengubah Suai Pembolehubah `const` Melalui Penunjuk Jenis Berbeza Membawa kepada Gelagat Tidak Ditakrifkan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan