为何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
相关产品推荐
相关产品推荐

