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

为何Zig函数中局部变量arr的栈地址每次执行都相同?

为什么Zig函数中局部变量的栈地址每次调用都相同?

我写了一个包含局部变量arr的Zig函数,原本以为每次函数执行时这个变量的栈地址都会不一样,但实际结果并非如此。

示例代码

const std = @import("std");

fn hello() void {
    var arr: [100]u8 = undefined;
    // 为什么地址每次都一样?
    std.debug.print("{*}\n", .{&arr});
}

pub fn main() void {
    hello();
    hello();
    hello();
}

运行输出

[100]u8@7fff0c1a4ef4
[100]u8@7fff0c1a4ef4
[100]u8@7fff0c1a4ef4

原因解释

函数调用结束后,栈空间会被释放,栈指针会回到调用前的位置。你的代码里,每次调用hello()时,栈的状态完全一致——没有其他栈操作占用额外空间,因此局部变量arr会被分配到同一个栈地址上。

另外,操作系统的栈地址随机化(ASLR)只针对进程栈的起始地址做随机,不会在每次函数调用时重新打乱栈内的变量位置。只要进程的栈起始地址固定,函数内局部变量相对于栈底的位置就不会改变,每次调用自然会拿到相同的绝对地址。

如果想看到不同的地址,可以在两次hello()调用之间加入其他栈操作,比如调用另一个占用栈空间的函数,或者在main里声明局部变量并修改,让栈指针位置发生变化,再次调用hello()时arr的地址就会不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:37:48