Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menghantar Penunjuk kepada Integer dengan Selamat dalam C Moden?

Bagaimana untuk Menghantar Penunjuk kepada Integer dengan Selamat dalam C Moden?

Barbara Streisand
Barbara Streisandasal
2024-11-12 07:13:02451semak imbas

How to Safely Cast Pointers to Integers in Modern C  ?

Mengirim Penunjuk kepada Integer: Pendekatan C Moden

Apabila memindahkan kod ke mesin 64-bit, adalah perlu untuk menangani isu yang berkaitan dengan penukaran penunjuk. Dalam fungsi dengan hujah void, apabila hujah dibuang ke jenis yang sesuai dalam fungsi, ralat berikut mungkin timbul: "cast from 'void' to 'int' loses precision."

Untuk menyelesaikan isu ini dan memastikan keserasian merentas mesin 32-bit dan 64-bit, pendekatan C 11 berikut disyorkan:

#include <cstdint>

void *p;
auto i = reinterpret_cast<std::uintptr_t>(p);

Jenis std::uintptr_t direka khusus untuk mewakili nilai penunjuk dan alamat. Menggunakan reinterpret_cast memastikan penukaran yang selamat dan jelas antara penuding void* dan perwakilan integer.

Pertimbangan untuk Keserasian

C 11 (dan seterusnya) Versi:

#include <cstdint>
std::uintptr_t i;

Versi C 03:

extern "C" {
#include <stdint.h>
}

uintptr_t i;

Versi C99:

#include <stdint.h>
uintptr_t i;

Adalah penting untuk ambil perhatian bahawa semasa uintptr_t menyediakan cara yang selamat untuk menyimpan nilai penunjuk sebagai integer, ia mungkin tidak semestinya sejajar dengan saiz integer dalam semua kes. Oleh itu, adalah disyorkan untuk menggunakan jenis yang sesuai untuk menyimpan dan memanipulasi nilai integer.

Atas ialah kandungan terperinci Bagaimana untuk Menghantar Penunjuk kepada Integer dengan Selamat dalam C Moden?. 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