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

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来释放内存。

判断一个变量是否在栈区,核心看两点:

  1. 是否是函数内的局部变量(无static修饰);
  2. 是否是通过自动分配(而非动态内存分配)创建的。

只要满足这两个条件,不管是基础类型(int、char)还是自定义结构体类型,都会被分配到栈区。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:39:56