给变量赋值的指针

kar*_*ick 2 c pointers

addr是函数的参数,read_value也是函数的局部变量。两者都是 int 类型。

那么什么是:

read_value = (* (int *) (addr))
Run Code Online (Sandbox Code Playgroud)

意思是?

Bla*_*iev 5

(int *) (addr)将 的数值转换addrint *指针。除非特别小心,否则此操作是不安全的,因为 的任意值都addr可能违反 的对齐要求int。一般来说,如果 的值addr不是 an 大小的倍数int,则可能导致读取未对齐,最终导致产生SIGBUS信号。

星号最终获取int位于该地址的值(称为取消引用)并将其保存到read_value. 如果地址没有充分对齐,则此时可能会发生未对齐的读取。如果地址碰巧受到限制或保护,取消引用也可能会导致分段错误。

我实际上会声明addr为类型uintptr_t,而不是int,因为这在强制转换到 之间提供了更多安全性int *uintptr_t应该对应于指针的大小和表示,而int类型在语义上与指针无关。