Rumah > pembangunan bahagian belakang > C++ > Mengapa Pembolehubah pada Alamat Memori yang Sama Menghasilkan Nilai Berbeza dalam C?

Mengapa Pembolehubah pada Alamat Memori yang Sama Menghasilkan Nilai Berbeza dalam C?

Patricia Arquette
Lepaskan: 2024-12-03 03:44:09
asal
136 orang telah melayarinya

Why Do Variables at the Same Memory Address Output Different Values in C  ?

Pembolehubah dengan Alamat Sama Mengeluarkan Nilai Berbeza

Pertimbangkan coretan 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

Anehnya, kod ini output:

40 65
0xbfacbe8c 0xbfacbe8c
Salin selepas log masuk

Bagaimana keadaannya mungkin pembolehubah pada alamat yang sama (c1 dan t) menghasilkan dua nilai yang berbeza ('A' dan 65)?

Penjelasan terletak pada sifat tingkah laku yang tidak ditentukan. Dalam kes ini, pengubahsuaian pembolehubah malar (*c1) mencetuskan tingkah laku yang tidak ditentukan. Mengikut piawaian C, gelagat yang tidak ditentukan boleh mengakibatkan hasil yang tidak dapat diramalkan, daripada penamatan program kepada gelagat yang didokumenkan (dengan atau tanpa mesej diagnostik).

Dalam contoh khusus ini, gelagat yang tidak ditentukan membolehkan pengkompil mengoptimumkan kod dalam cara yang tidak dijangka. Dengan mengubah suai pembolehubah malar, pengkompil secara berkesan mengatasi nilai asal a1. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa tingkah laku ini tidak dijamin dan mungkin berbeza-beza merentasi penyusun dan persekitaran yang berbeza.

Oleh itu, apabila bekerja dengan pembolehubah dan penunjuk malar, adalah penting untuk mengelak daripada mengubah suai pembolehubah ini untuk memastikan program boleh diramal tingkah laku.

Atas ialah kandungan terperinci Mengapa Pembolehubah pada Alamat Memori yang Sama Menghasilkan Nilai Berbeza 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