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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:14:59