Why did variables within a stack function revert to 0 in Zig version 0.14.0 if they were called again? This was logical, as the function’s scope had expired. However, in Zig version 0.15.0, do the values persist?
fn printMem(param: *const u8, constant: *const u8, variable: *const u8) void {
std.debug.print("param: {x}\nconst: {x}\nvar: {x}\n\n", .{
@intFromPtr(param),
@intFromPtr(constant),
@intFromPtr(variable),
});
}
fn c(p: u8) struct { *const u8, *u8 } {
const lc: u8 = 3;
var lv: u8 = 99;
std.debug.print("c: \n", .{});
printMem(&p, &lc, &lv)
return .{ &lc, &lv };
}
pub fn main() !void {
const ptr_to_const, const ptr_to_var = c(15);
// Pointer to const and local var.
std.debug.print("\nptr_to_const: {x} = {}\nptr_to_var: {x} = {}\n\n", .{
@intFromPtr(ptr_to_const),
ptr_to_const.*,
@intFromPtr(ptr_to_var),
ptr_to_var.*,
});
// and again...
std.debug.print("\nptr_to_const: {x} = {}\nptr_to_var: {x} = {}\n\n", .{
@intFromPtr(ptr_to_const),
ptr_to_const.*,
@intFromPtr(ptr_to_var),
ptr_to_var.*,
});
}
I apologize if this is silly or something I’m overlooking, it just seems strange to me and I don’t understand what changes were made in zig 0.15.1 or 0.15.2, I’m using zig 0.14.0.
Ouput 0.15.1 and 0.15.2
c:
param: 7ffeadf6c3e9
const: 11981b5
var: 7ffeadf6c3ea
ptr_to_const: 11981b5 = 3
ptr_to_var: 7ffeadf6c3ea = 99
ptr_to_const: 11981b5 = 3
ptr_to_var: 7ffeadf6c3ea = 99
Ouput 0.14.0
c:
param: 7fff76d6ad7d
const: 10217c0
var: 7fff76d6ad7f
ptr_to_const: 10217c0 = 3
ptr_to_var: 7fff76d6ad7f = 99
ptr_to_const: 10217c0 = 3
ptr_to_var: 7fff76d6ad7f = 0