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

栈的大致地址范围是多少?C语言局部变量栈地址疑问咨询

C语言栈地址相关问题解答

认知正误判断

你对栈的基础功能、增长方向的认知是正确的,问题出在对用户态地址空间的区间判断上。
你拿到的局部变量地址0x00bef6fc不属于代码区:32位Windows系统下,用户态虚拟地址总范围是0x00000000 ~ 0x7FFFFFFF,内核态占用0x80000000以上的高地址区间,用户程序完全无法访问。常规32位程序的代码区通常位于0x00400000以下的低地址段,你拿到的0x00bef6fc刚好属于32位程序典型的栈地址区间,完全符合局部变量存于栈的规则。

验证方法

你可以运行以下代码直观对比不同存储区的地址差异:

#include <stdio.h>
// 全局变量,存储于数据段
int global_var;

int test_func(int param) {
    // 局部变量,存储于栈
    int inner_var;
    printf("函数参数地址:%p\n", &param);
    printf("函数内局部变量地址:%p\n", &inner_var);
    return 0;
}

int main() {
    int num1, num2;
    printf("main函数(代码段)地址:%p\n", main);
    printf("全局变量(数据段)地址:%p\n", &global_var);
    printf("局部变量num1地址:%p\n", &num1);
    printf("局部变量num2地址:%p\n", &num2);
    test_func(10);
    return 0;
}

运行后可以观察到几个明显规律:

  • 代码段的main函数地址远低于栈地址
  • 栈上的局部变量、函数参数地址非常接近,且后定义的变量/先传入的参数地址更低,符合栈从高向低增长的特性
  • 数据段的全局变量地址介于代码段和栈地址之间

栈的地址范围说明

栈没有统一的固定地址范围,受多个因素影响:

  • 操作系统位数:32位系统用户态地址上限是2GB/3GB,64位系统用户态地址上限通常是128TB
  • 系统配置:不同操作系统默认的栈起始位置、栈大小不同,Windows默认栈大小1MB,Linux默认8MB
  • ASLR机制:现在主流系统默认开启地址空间布局随机化,栈的起始地址每次程序运行都会随机偏移,不会固定
  • 编译选项:可以通过编译参数手动调整栈的大小、基地址

常规场景下的参考范围:

  • 32位Windows:栈地址通常在0x00b00000 ~ 0x70000000区间
  • 32位Linux:栈地址通常在0xbfff0000附近区间
  • 64位全平台:栈地址通常在0x7ffxxxxxxxxxx附近的高地址区间

内容的提问来源于stack exchange,提问作者y J.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:54:05