C语言中的指针是按需创建的吗?
C语言变量地址的生成逻辑
先纠正你认知里的核心混淆点:变量的地址是内存存储变量的固有属性,和专门存储地址的指针变量完全是两回事,你说的“分配对应的指针”本身就是把这两个概念搞混了。
- 只要是在内存中存储的变量(没有被编译器优化为寄存器变量、也没有被常量折叠消除),它的地址在编译链接阶段就已经完全确定了:栈变量是栈基址的固定偏移量,全局/静态变量是数据段的固定虚拟地址,这个地址和变量绑定,不需要“创建”也不需要“分配”,更不会出现你说的无限指针循环——地址本身只是个数值,你不把它存到指针变量里的时候,不会额外占用任何存储空间,自然也不会有“每个地址都需要一个指针存它”的问题。
- 我们常说的「指针」本质是存储地址值的独立变量,这才是需要显式定义、单独分配存储空间的对象。比如你写
int *p = &a;时,p是指针变量,占用自己的内存空间,而&a只是取出a自带的地址数值而已,和你读取a本身存储的10这类数值没有本质区别,不是临时“生成”了一个地址。 - 你感知到的“按需存在”其实是编译器优化的结果:如果你的代码全程没有用到某变量的地址,也不需要通过地址访问它,编译器很可能会把它优化到寄存器里存储,甚至直接替换成常量,这时候这个变量就没有对应的内存地址,自然也没法用
&取址。但这属于实现层面的优化行为,不是C语言的标准规则,标准规定只要是具备内存存储的变量,从生命周期开始的那一刻地址就是固定存在的。
内容的提问来源于stack exchange,提问作者aNoNyMoUs
相关产品推荐
相关产品推荐

