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

数组变量是否分配内存存首地址?函数调用时地址解析问询

C语言数组变量的存储与地址解析问题解答

先看你给出的代码片段:

void func() { 
    int arr[5]={1,2,3,4,5}; 
    int variable = arr[1]; // variable will be set to 2 
}

第一个问题:数组变量arr本身有没有被分配存储空间?

完全没有。在C语言里,数组名arr并不是一个可以单独存储的指针变量——它更像是一个「编译期的常量占位符」,指向数组的第一个元素,但编译器不会为它在栈、数据段或者其他内存区域单独开辟空间来存这个地址值。你可以试试写arr = &some_other_int;这种代码,编译器直接会报错,这也能侧面证明arr不是一个可修改的变量,自然不需要存储空间。

第二个问题:每次调用func栈地址变化时,arr怎么被解析成数组起始地址?

这核心在于编译器的编译期静态计算,而非运行时读取某个arr变量的地址:

  • 当编译int variable = arr[1];时,编译器会把arr[1]转换成*(arr + 1),但这里的arr并不是一个需要从内存读取的变量,而是直接被替换成了当前函数栈帧中数组首元素的相对偏移量。
  • 当func被调用时,CPU会为这个函数创建新的栈帧,并用基址寄存器(比如x86架构的rbp)指向栈帧的固定位置。编译器在编译阶段就已经算好了:数组arr的第一个元素arr[0],位于栈帧基址的某个固定偏移位置(比如假设int占4字节,5个int就是20字节,那arr[0]可能在rbp - 20的位置)。
  • 要访问arr[1]的时候,编译器生成的机器指令会直接计算「栈帧基址 + 偏移量 + 1*sizeof(int)」,直接定位到目标内存,根本不需要通过一个存储arr地址的变量来间接查找。

说白了,arr在编译的时候就已经被「替换」成了栈帧内的位置计算规则,不管函数每次调用时栈的绝对地址怎么变,只要栈帧的结构不变,这个相对偏移就能准确找到数组的元素。


内容的提问来源于stack exchange,提问作者Darshan L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:40:42