我在 Zig 中有以下内容
const std = @import("std");
var messages = [2]*[]u8{undefined, undefined};
pub fn main() !void {
// Allocate some strings
const msg1 = "First message";
const msg2 = "Second message has different length";
const allocator = std.heap.page_allocator;
const msg1_ptr = try allocator.alloc(u8, msg1.len);
defer allocator.free(msg1_ptr);
const msg2_ptr = try allocator.alloc(u8, msg2.len);
defer allocator.free(msg2_ptr);
messages[0] = @as(*[]u8, &msg1_ptr);
messages[1] = @as(*[]u8, &msg2_ptr);
它给出了以下错误
src/main.zig:14:30: error: expected type '*[]u8', found '*const []u8'
messages[0] = @as(*[]u8, &msg1_ptr);
^~~~~~~~~
src/main.zig:14:30: note: cast discards const qualifier
referenced by:
callMain: /usr/local/Cellar/zig/0.13.0/lib/zig/std/start.zig:524:32
callMainWithArgs: /usr/local/Cellar/zig/0.13.0/lib/zig/std/start.zig:482:12
remaining reference traces hidden; use '-freference-trace' to see all reference traces
为了解决这个问题,只需将指针的 const 改为 var 即可
var msg1_ptr = try allocator.alloc(u8, msg1.len);
defer allocator.free(msg1_ptr);
var msg2_ptr = try allocator.alloc(u8, msg2.len);
defer allocator.free(msg2_ptr);
为什么 const 指针不能强制转换为 const 无关的指针,但将其更改为 var 是有效的?是不是因为 const 意味着不可变,而 var 则不然,所以限制较少?这是否意味着 const 指针永远不能被强制转换?
局部变量上的 const表示初始化后变量的值不会改变。从技术上讲,您可以抛弃 const 并尝试更改变量,但其字节可能位于只读内存中。
在这种情况下,
msg1_ptr
是一个切片([]u8
),它是一个胖指针- 它包含指向数据的指针和长度。 这const
意味着切片本身不能改变,但数据没有声明为 const(它是u8
,不是const u8
),所以它可以改变。通过获取地址
msg1_ptr
,您将获得一个 const 指针。 const 指针意味着内存将被读取,但不会被更改/写入。 例如,想要通过指针读取某些内容但不对其进行更改的函数通常会将参数声明为 const。 举个std.mem.indexOf
例子:@as
用于强制类型转换。它不强制类型转换。从 切换
const
到var
是正确的解决方案。如果您不想将其声明为 const,则首先不要将其声明为 const。可
@constCast
用于从指针中删除 const 限定符。但您只能在特殊情况下使用它。