@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
- Inicialização de buffers: Preencher buffers com zero ou valor padrão antes do uso.
- Limpeza de dados sensíveis: Zerar memória que continha senhas ou chaves criptográficas.
- Criação de separadores: Preencher arrays de caracteres para formatação visual.
- 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