私は現在 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 番目のコードがセグ フォールトをトリガーする理由を誰か説明できますか?