Rumah >pembangunan bahagian belakang >C++ >Adakah Aritmetik Penunjuk pada Tatasusunan Bukan Aksara dalam Gelagat Ditakrifkan C?

Adakah Aritmetik Penunjuk pada Tatasusunan Bukan Aksara dalam Gelagat Ditakrifkan C?

Linda Hamilton
Linda Hamiltonasal
2024-11-09 09:59:02947semak imbas

Is Pointer Arithmetic on Non-Character Arrays in C   Defined Behavior?

Aritmetik Penunjuk pada Tatasusunan Bukan Aksara

Dalam C , kelakuan aritmetik penunjuk ditakrifkan dengan baik untuk penunjuk yang merujuk tatasusunan atau titik ke permulaan tatasusunan. Walau bagaimanapun, persoalan timbul apabila aritmetik penuding digunakan pada penuding yang tidak menunjuk secara langsung kepada tatasusunan aksara.

Pertimbangkan coretan kod berikut:

struct Foo {
    float x, y, z;
};

Foo f;
char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z);

Garis bermasalah yang ditandakan dengan (*) memberikan alamat ahli z struct Foo kepada penunjuk p. Menurut piawai (expr.add/4), operasi ini boleh dianggap sebagai tingkah laku tidak ditentukan (UB) kerana p tidak menunjuk kepada tatasusunan aksara.

Walau bagaimanapun, piawaian juga menyatakan bahawa bait asas mana-mana objek yang boleh disalin secara remeh boleh disalin ke dalam tatasusunan char atau unsigned char. Ini menunjukkan bahawa aritmetik penunjuk harus sah untuk penunjuk kepada bait mentah yang membentuk objek, tidak kira sama ada ia membentuk tatasusunan.

Dalam kes khusus ini, tujuan di sebalik kod adalah untuk mengakses ahli z menggunakan reinterpret_cast. Walaupun piawaian tidak menyatakan secara eksplisit bahawa aritmetik penunjuk ditakrifkan dalam senario sedemikian, ia akan sangat mengehadkan kegunaan offsetof jika tidak.

Oleh itu, penambahan dalam baris (*) dianggap sah dalam C . Aritmetik penuding pada p dibenarkan dan ia menunjukkan dengan betul kepada ahli z dalam struct Foo.

Atas ialah kandungan terperinci Adakah Aritmetik Penunjuk pada Tatasusunan Bukan Aksara dalam Gelagat 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