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
Patricia Arquetteasal
2024-12-03 03:44:09141semak imbas

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;

Anehnya, kod ini output:

40 65
0xbfacbe8c 0xbfacbe8c

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!

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