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

传递包含数组的结构体时,数组名对应的首地址值为何会发生变化?

问题解答

核心差异来自C语言中数组直接传参和结构体包含数组时传参的完全不同的处理规则:

1. 直接传数组场景的原理

C语言有明确规定:当数组名作为实参直接传递给函数时,数组名会自动退化为指向数组首元素的指针。
哪怕你形参写的是void change(int data[]),编译器也会隐式把data的类型处理为int *,你传递的本质就是原数组的首地址,所以形参拿到的地址和外层数组名的地址完全一致。

2. 结构体值传递的逻辑

结构体值传递的规则是:将整个结构体的完整内存内容拷贝一份,赋值给栈上的形参变量,形参是完全独立于原结构体的新变量,有自己独立的内存空间。
你定义的ArrayList结构体,int data[5]是结构体的内置成员,属于结构体内存布局的一部分,不是独立的指针:32位int环境下整个结构体的大小就是5*4=20字节,data数组直接占满了整个结构体的内存空间。
当你调用change(test)时,会把原结构体test占的20字节完整拷贝到形参arr的内存区域,因此:

  • arr自己的data数组属于arr的内存块,它的首地址 = arr自身的地址 + data在结构体中的偏移(这里偏移为0,所以arr.data的地址和&arr完全相等)
  • 原test.data的地址 = &test + 偏移0,和&arr本身就不相等,所以二者的data地址自然不同
  • 但因为是完整内存拷贝,arr.data里存储的5个int值和test.data的值完全一致

误区纠正

你之前的误解是认为结构体传递时内部的数组会单独发生指针退化,实际上数组退化只发生在数组名直接作为函数实参的场景,结构体内部的数组是结构体的一部分,不会单独退化,会跟随整个结构体一起被完整拷贝。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:57:00