system:
zig version 0.13.0 on Ubuntu 20.04.6 LTS
So, I want to have a variable of type [][]u8
as slice of strings which alloced on stack. Just to store some arbitrary strings.
Here is my code:
const std = @import("std");
fn makeSliceOfStrings(comptime num: usize, comptime size: usize) type {
return struct {
const Self = @This();
buffer: [num * size + num * @sizeOf([]u8)]u8,
data: [][]u8 = undefined,
fba: std.heap.FixedBufferAllocator = undefined,
allocator: std.mem.Allocator = undefined,
pub fn new() !Self {
var self = Self{ .buffer = .{0} ** (num * size + num * @sizeOf([]u8)) };
std.debug.print("buffer addr: {*}\n", .{&self.buffer});
std.debug.print("buffer: {any}\n", .{self.buffer});
self.fba = std.heap.FixedBufferAllocator.init(&self.buffer);
self.allocator = self.fba.allocator();
self.data = try self.allocator.alloc([]u8, num);
std.debug.print("data addr: {*}\n", .{self.data.ptr});
for (self.data, 0..) |_, idx| {
const datatmp = try self.allocator.alloc(u8, size);
// std.debug.print("data[{d}] data addr: {*}\n", .{ idx, datatmp.ptr });
self.data[idx] = datatmp;
std.debug.print("sos data[{d}] fatptr addr:{*} addr: {*} len:{d}\n", .{ idx, &(self.data[idx]), self.data[idx].ptr, self.data[idx].len });
}
std.debug.print("buffer 2: {any}\n", .{self.buffer});
return self;
}
pub fn clear(self: *Self) void {
std.debug.print("clear data addr: {*}\n", .{self.data.ptr});
for (self.data, 0..) |_, idx| {
std.debug.print("clear data[{d}] fatptr addr:{*} addr: {*} len:{d}\n", .{ idx, &(self.data[idx]), self.data[idx].ptr, self.data[idx].len });
// @memset(self.data[idx], 0);
}
std.debug.print("buffer 3: {any}\n", .{self.buffer});
}
};
}
fn doSomething(_: [][]u8) void {}
pub fn main() !void {
var sos = try makeSliceOfStrings(3, 32).new();
sos.clear();
std.debug.print("data len:{d} ptr:{*}\n", .{ sos.data.len, sos.data.ptr });
for (sos.data, 0..) |s, idx| {
std.debug.print("idx:{d}, addr: {*} len:{d}\n", .{ idx, s.ptr, s.len });
std.debug.print("print buffer[{d}] fatptr addr:{*} addr: {*} len:{d}\n", .{ idx, &(sos.data[idx]), sos.data[idx].ptr, sos.data[idx].len });
// std.debug.print("data:{s}\n", .{s});
}
doSomething(sos.data);
}
Here is the print:
buffer addr: [144]u8@7ffff60ef678
buffer: { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
data addr: []u8@7ffff60ef678
sos data[0] fatptr addr:[]u8@7ffff60ef678 addr: u8@7ffff60ef6a8 len:32
sos data[1] fatptr addr:[]u8@7ffff60ef688 addr: u8@7ffff60ef6c8 len:32
sos data[2] fatptr addr:[]u8@7ffff60ef698 addr: u8@7ffff60ef6e8 len:32
buffer 2: { 168, 246, 14, 246, 255, 127, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 200, 246, 14, 246, 255, 127, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 232, 246, 14, 246, 255, 127, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170 }
clear data addr: []u8@7ffff60ef678
clear data[0] fatptr addr:[]u8@7ffff60ef678 addr: u8@7ffff60ef9cc len:1
clear data[1] fatptr addr:[]u8@7ffff60ef688 addr: u8@0 len:140737321563984
clear data[2] fatptr addr:[]u8@7ffff60ef698 addr: u8@105c134 len:1
buffer 3: { 168, 246, 14, 246, 255, 127, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 200, 246, 14, 246, 255, 127, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 232, 246, 14, 246, 255, 127, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170 }
data len:3 ptr:[]u8@7ffff60ef678
idx:0, addr: u8@20109cc3a len:140737321564872
print buffer[0] fatptr addr:[]u8@7ffff60ef678 addr: u8@1 len:16907863
idx:1, addr: u8@1 len:0
print buffer[1] fatptr addr:[]u8@7ffff60ef688 addr: u8@200000000 len:16907863
idx:2, addr: u8@3b len:57
print buffer[2] fatptr addr:[]u8@7ffff60ef698 addr: u8@1 len:1
In new
every thing is good.
In clear
and main
data[idx].len
and data[idx].ptr
got weird.
Any idea why?