如何在不触发警告的情况下将整数值转换为指针地址

Pro*_*gga 5 c embedded pointers integer

我有以下变量

uint32_t Value = 0x80
Run Code Online (Sandbox Code Playgroud)

0x80代表存储器中的地址,例如

// Write 2 at address 0x80
*(uint32_t*)((uint32_t)0x80) = 2;
Run Code Online (Sandbox Code Playgroud)

如何将Value转换为Pointer,使其指向0x80?

uint32_t *Pointer = ?? Value;
Run Code Online (Sandbox Code Playgroud)

这个:

(uint32_t*)(uint32_t)Value;
Run Code Online (Sandbox Code Playgroud)

返回:

warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
Run Code Online (Sandbox Code Playgroud)

chu*_*ica 6

要处理整数到对象指针的转换,请使用可选的整数uintptr_tintptr_t类型。函数指针是另一回事。

以下类型指定一个无符号整数类型,其属性为任何有效的指向的指针void都可以转换为该类型,然后转换回指向 的指针void,结果将比较等于原始指针 C11dr 7.20.1.4 1

uintptr_t
Run Code Online (Sandbox Code Playgroud)

然后将 转换void *为所需的类型。

#include <stdint.h>
uintptr_t Value = 0x80;
uint32_t *Pointer = (void *) Value;
Run Code Online (Sandbox Code Playgroud)

如果 0x80 不是从有效的 派生的,则会uint32_t *导致未定义的行为(UB)。然而,听起来 OP 是在一个具有内存映射数据位置的平台上。