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

C语言内存分配地址异常:为何变量a地址固定而b每次不同?

问题分析与解答

首先,你的程序存在格式符与参数不匹配的严重问题,这直接导致了你看到的异常输出,并非内存分配机制的特殊行为。

1. 程序的核心错误

你写的printf语句:

printf("%d %p %d %p", a, b, &a, &b);

格式符的顺序和对应参数完全不匹配:

  • 第一个%d对应a(int类型,但a未初始化,值是随机的)
  • 第二个%p要求传入指针类型,但你传的是b(int类型),这会把b的随机值强行解析成指针地址
  • 第三个%d要求传入int类型,但你传的是&a(指针类型),64位系统下指针是8字节,int是4字节,这会直接截断指针地址的高位数据
  • 第四个%p对应&b(指针类型,这部分是正确的)

你看到的“变量a的地址始终是0000000000000010”,其实是未初始化的变量b的随机值被错误解析成了指针,而真正的&a地址被当成int打印了,你完全搞反了输出对应的变量。

2. 局部变量的内存分配逻辑

现代操作系统默认开启ASLR(地址空间布局随机化),每次运行程序时,栈的基地址会随机偏移,所以栈上的局部变量(比如a、b)的地址每次都会变化。但你的程序因为格式错误,根本没正确打印出&a的地址。

3. 修正后的程序

把printf语句改成参数与格式符严格对应,同时标注未初始化变量的特性:

#include <stdio.h>

int main(void){
    int a;
    int b;
    // 格式符与参数一一对应,明确标注未初始化变量的值是随机的
    printf("a(未初始化,值随机):%d,a的地址:%p\n", a, &a);
    printf("b(未初始化,值随机):%d,b的地址:%p\n", b, &b);
    
    return 0;
}

运行修正后的程序,你会发现&a和&b的地址每次运行都会变化,完全符合你原本的预期。

4. 额外注意点

  • 未初始化的自动局部变量(栈上的变量)的值是不确定的,直接打印它们属于未定义行为,结果可能每次都不一样,甚至导致程序崩溃。
  • 在64位系统中,%p打印的是8字节的指针地址,而%d只能处理4字节的int,强行用%d打印指针会丢失高位数据,导致地址显示完全错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:42:22