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{|}~

2 番目のコードがセグ フォールトをトリガーする理由を誰か説明できますか?

4

2 に答える 2