Mengapa Pengubahsuaian Pemalar melalui Penunjuk Bukan Konst Menghasilkan Gelagat Tidak Ditakrifkan?

Linda Hamilton
Lepaskan: 2024-10-29 05:31:02
asal
824 orang telah melayarinya

Why Does Modifying a Constant through a Non-const Pointer Produce Undefined Behavior?

Mengubah suai Pemalar melalui Penunjuk Bukan Pemalar: Menyelidiki Gelagat Tidak Ditakrifkan

Dalam coretan kod yang disediakan, anda menyatakan kekeliruan mengenai tingkah laku mengubah suai integer malar (e) melalui penuding bukan const (w):

<code class="cpp">const int e = 2;

int* w = (int*) &e;  // Casting to remove const-ness
*w = 5;            // Modifying the value pointed to by w</code>
Salin selepas log masuk

Selepas membuat pengubahsuaian ini, anda perhatikan bahawa:

  • Memaparkan nilai yang ditunjuk oleh w (cout << w << endl;) output 5, seperti yang dijangkakan.
  • Walau bagaimanapun, memaparkan nilai e (*cout << e << endl;) secara mengejutkan mengeluarkan 2, nilai asalnya.

Anda notis selanjutnya bahawa alamat yang ditunjuk oleh w adalah sama dengan alamat e (cout << "w = " << w << endl ;cout << "&e = " << Ini membawa anda untuk mempersoalkan bagaimana e kekal tidak berubah walaupun pengubahsuaian dibuat melalui w.

Tingkah laku ini berpunca daripada tingkah laku tidak ditentukan yang timbul apabila mengubah suai pemalar melalui bukan -const penunjuk. Sebaik sahaja anda membuat pengubahsuaian sedemikian, kod tersebut memasuki wilayah gelagat yang tidak ditentukan, di mana ia menjadi tidak dapat diramalkan dan bergantung pada butiran pelaksanaan tertentu.

Dalam kes ini, nampaknya pengubahsuaian melalui w mempengaruhi salinan sementara e pada masa jalan, manakala e asal kekal tidak berubah. Sebabnya ialah e dianggap sebagai pemalar masa kompilasi dan nilainya dikodkan keras ke dalam kod binari. Oleh itu, sebarang pengubahsuaian masa jalan kepada w tidak akan menjejaskan e asal.

Tingkah laku ini khusus untuk pelaksanaan yang digunakan dan tidak boleh dipercayai. Mengubah suai data tetap melalui penunjuk bukan const dianggap sebagai amalan buruk dan harus dielakkan. Pendekatan yang betul ialah menggunakan rujukan bukan const atau mencipta salinan bukan const bagi data yang anda ingin ubah suai.

Atas ialah kandungan terperinci Mengapa Pengubahsuaian Pemalar melalui Penunjuk Bukan Konst Menghasilkan Gelagat Tidak Ditakrifkan?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!