You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以最简方式获取唯一的指针地址?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:20:03