Swift中结构体变量存储位置疑问:为何不存于进程数据区?
结构体变量的内存区域分配问题
一、全局结构体变量会被分配到数据区(Data Segment)
全局变量(包括结构体类型的全局变量)和静态变量的存储位置只和变量的作用域/存储类别有关,和变量的类型(是否为结构体)完全无关。
只要你把结构体变量声明为全局(在函数外部定义),或者用static修饰(不管是全局域还是函数内的静态变量),它就会被分配到数据区——细分的话,初始化完成的变量会放在已初始化数据段.data,未初始化的则放在未初始化数据段.bss。
举个代码示例:
// 全局结构体变量,存放在Data区 struct User { int id; char name[20]; } global_user; int main() { // 函数内静态结构体变量,同样存放在Data区 static struct User static_user; return 0; }
二、为什么普通结构体变量会在栈区?
普通结构体变量(既不是全局,也没有static修饰)的存储位置由定义位置决定:
- 如果是在函数内部(包括
main函数)定义的局部变量,会被分配到栈区(Stack Segment)。栈区的作用就是存储函数调用期间的局部变量、函数参数、返回地址等临时数据,函数执行结束后,栈上的变量会被自动释放。 - 要是用
malloc/calloc这类接口动态分配的结构体变量,会存放在堆区(Heap Segment),需要手动调用free来释放内存。
判断一个变量是否在栈区,核心看两点:
- 是否是函数内的局部变量(无
static修饰); - 是否是通过自动分配(而非动态内存分配)创建的。
只要满足这两个条件,不管是基础类型(int、char)还是自定义结构体类型,都会被分配到栈区。
内容的提问来源于stack exchange,提问作者iyeaaa
相关产品推荐
相关产品推荐

