@memset em Zig — Referência e Exemplos

@memset em Zig

O @memset preenche uma região de memória (slice) com um valor específico. É a forma idiomática em Zig de inicializar buffers, zerar memória ou preencher arrays com um valor padrão. Internamente, pode ser otimizado para instruções de memória da CPU.

Sintaxe

@memset(dest: []T, value: T) void

Parâmetros

  • dest ([]T): Slice de destino a ser preenchido.
  • value (T): Valor com o qual preencher cada posição do slice.

Valor de retorno

void — a operação modifica a memória diretamente.

Exemplos práticos

Exemplo 1: Inicializar buffer com zeros

const std = @import("std");

pub fn main() void {
    var buffer: [1024]u8 = undefined;

    // Preencher com zeros
    @memset(&buffer, 0);

    std.debug.print("Primeiros bytes: {any}\n", .{buffer[0..8]});
    // { 0, 0, 0, 0, 0, 0, 0, 0 }
}

Exemplo 2: Preencher com caractere específico

const std = @import("std");

pub fn main() void {
    var linha: [40]u8 = undefined;

    // Preencher com traços para criar separador visual
    @memset(&linha, '-');

    std.debug.print("{s}\n", .{&linha});
    // ----------------------------------------
}

Exemplo 3: Limpar dados sensíveis

const std = @import("std");

fn processarSenha(senha: []const u8) void {
    var copia: [256]u8 = undefined;
    const tamanho = @min(senha.len, copia.len);

    @memcpy(copia[0..tamanho], senha[0..tamanho]);

    // Processar a senha...
    std.debug.print("Senha tem {} chars\n", .{tamanho});

    // Limpar a cópia da memória antes de sair do escopo
    @memset(copia[0..tamanho], 0);
}

pub fn main() void {
    processarSenha("minha-senha-secreta");
}

Casos de uso comuns

  1. Inicialização de buffers: Preencher buffers com zero ou valor padrão antes do uso.
  2. Limpeza de dados sensíveis: Zerar memória que continha senhas ou chaves criptográficas.
  3. Criação de separadores: Preencher arrays de caracteres para formatação visual.
  4. Preparação de memória alocada: Inicializar memória retornada por allocators.

Builtins relacionados

  • @memcpy — Copia bloco de memória
  • @sizeOf — Calcular tamanho do buffer
  • @ptrCast — Converter ponteiros antes de memset

Tutoriais relacionados

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.