如何以最简方式获取唯一的指针地址?
C语言中获取唯一指针地址的三种写法分析(基于C11/K&R 2标准)
核心前提
指针本身是一个存储内存地址的变量,但声明指针时仅为指针本身分配存储空间,不会自动指向任何有效地址。要获得唯一的有效指针地址,必须让指针指向一个已分配的合法对象。以下是三种写法的具体分析:
写法一:未初始化指针赋值
int * my_ptr; int * unique_address = my_ptr;
- 标准依据:
C11 §6.7.9 第10条规定:"若自动存储期对象未显式初始化,其值为不确定值";K&R 2第4.9节明确:"局部变量未初始化,值不确定"。 - 问题:
my_ptr是未初始化的自动指针,值为随机的不确定地址(野指针)。将其赋值给unique_address后,得到的同样是无效且不唯一的随机地址,使用该指针会触发未定义行为(C11 §3.4.3),完全无法满足"唯一有效地址"的需求。
写法二:指向未初始化的普通变量
int my_val; int * unique_address = &my_val;
- 标准依据:
C11 §6.2.4 第5条规定:"无链接且未加static存储类的标识符声明的对象,拥有自动存储期"——my_val是已分配存储空间的合法对象;K&R 2第5.3节指出:"一元运算符&用于获取对象地址,操作数必须是左值",my_val是左值,因此&my_val合法。 - 有效性:
my_val的地址在其存储空间分配时就已确定,是当前作用域内唯一的有效地址。虽然my_val未初始化、值不确定,但这并不影响其地址的唯一性和合法性。
写法三:指向已初始化的普通变量
int my_val = 5; int * unique_address = &my_val;
- 标准依据:
C11 §6.2.6.1 第4条规定:"对象的值由其表示的最低N位决定,N为该类型对象的位数"——对象的地址是存储位置的标识,与存储的值无关;K&R 2第2.2节明确:"变量占据存储位置,每个变量都有地址"。 - 有效性:本质和写法二完全一致,
&my_val获取的地址同样是唯一且合法的。区别仅在于my_val被显式赋值为5,若仅需唯一地址,写法二已足够;若需要变量有确定初始值,则选此写法。
结论
要获取唯一的有效指针地址,必须让指针指向已分配存储空间的合法对象:
- 写法一完全不可行,属于未定义行为;
- 写法二和写法三都能满足需求,二者的区别仅在于目标变量是否有确定初始值,不影响地址的唯一性。
内容的提问来源于stack exchange,提问作者devgirl05
相关产品推荐
相关产品推荐

