在Zig中无法修改var声明的结构体指针字段问题求助
Zig编译错误:无法给常量赋值的原因及解决方法
问题代码
const std = @import("std"); pub fn main() void { var u = &User{ .id = 2 }; u.id = 54; } const User = struct { id: i32 };
编译错误信息
main.zig:5:6: error: cannot assign to constant u.id = 54; ~^~~ referenced by: callMain: /opt/homebrew/Cellar/zig/0.12.0/lib/zig/std/start.zig:501:17 callMainWithArgs: /opt/homebrew/Cellar/zig/0.12.0/lib/zig/std/start.zig:469:12 remaining reference traces hidden; use '-freference-trace' to see all reference traces
原因分析
你用var u声明的是指针变量本身,但&User{ .id = 2 }创建的是临时常量结构体实例。指针本身是可变的(可以让u指向其他地址),但它指向的结构体内容是不可变的,所以修改u.id会触发编译错误。
在Zig中,直接通过Struct{...}语法创建的实例默认是常量,即使把它的指针存在var变量里,指向的对象依然保持不可变性。
解决方案
方案1:先创建可变结构体实例,再取指针
先声明一个可变的结构体变量,再获取它的指针,这样指针指向的内容就是可变的:
const std = @import("std"); pub fn main() void { var user_instance = User{ .id = 2 }; var u = &user_instance; u.id = 54; // 可正常修改 } const User = struct { id: i32 };
方案2:通过分配器在堆上创建可变实例
如果需要在堆上分配可变结构体,使用标准库的分配器:
const std = @import("std"); pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const allocator = gpa.allocator(); defer _ = gpa.deinit(); var u = try allocator.create(User); defer allocator.destroy(u); u.id = 2; u.id = 54; // 可正常修改 } const User = struct { id: i32 };
内容的提问来源于stack exchange,提问作者Shubhang b
相关产品推荐
相关产品推荐

