I have the following in Zig
<code> 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);
</code>
<code> 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);
</code>
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);
It gives the following error
<code>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
</code>
<code>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
</code>
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
To fix it, it was enough to change the const to var for the pointers
<code> 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);
</code>
<code> 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);
</code>
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);
Why does a const pointer not cast to a const-agnostic pointer, but changing it to var is valid? Is it because const implies immutable, but var does not so has less restrictions? Does that mean const pointers can never be cast?