2

我目前正在学习 Zig(在 C 方面的经验很少),我正在用字符串做一些实验,以确保我正确理解这个概念。

例如,由于字符串是数组,u8我发现我可以使用以下代码打印字符“C”:

std.debug.print("{}", .{[_]u8{67}});

然后我尝试制作一个循环来打印一些基本字符,代码范围从 33 到 126:

var i: u8 = 33;
while (i < 127) {
    std.debug.print("{}", .{[_]u8{i}});
    i += 1;
}

但是当我运行它时,会发生以下错误:

Segmentation fault at address 0x202710
/home/cassidy/learning-zig/hello-world/src/main.zig:9:39: 0x22ae15 in main (main)
        std.debug.print("{}", .{[_]u8{i}});
                                      ^
/snap/zig/2222/lib/zig/std/start.zig:272:37: 0x204b9d in std.start.posixCallMainAndExit (main)
            const result = root.main() catch |err| {
                                    ^
/snap/zig/2222/lib/zig/std/start.zig:143:5: 0x2048df in std.start._start (main)
    @call(.{ .modifier = .never_inline }, posixCallMainAndExit, .{});
    ^
[1]    24766 abort (core dumped)  ./main

最奇怪的是,当我稍微更改代码以创建一个保存u8数组的变量时,它会按预期工作:

var i: u8 = 33;
while (i < 127) {
    const c = [_]u8{i};
    std.debug.print("{}", .{c});
    i += 1;
}

回报:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

有人可以解释为什么第二个代码会触发段错误吗?

4

2 回答 2

1

在询问 Zig Discord 之后,它似乎确实是一个错误。希望它会很快得到修复,因为该语言仍在大力开发中!

于 2020-09-17T14:42:48.283 回答
0

您遇到的是一个错误,但仍然可以打印字符

执行此操作的标准方法是{c}打印一个字符(或合并#6390{u}后,将 unicode 代码点打印为 utf-8)

std.debug.print("{c}", .{i});

[_]u8{i}如果您先使用它的地址,也可以打印它,*const [1]u8而不是[1]u8

std.debug.print("{}", .{&[_]u8{i}});
于 2020-10-10T19:58:47.077 回答