struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
Estou preenchendo esta estrutura e usando os valores. Na próxima iteração, desejo redefinir todos os campos para 0
ou null
antes de começar a reutilizá-los.
Como eu posso fazer isso? Posso usar memset
ou devo passar por todos os membros e depois fazer isso individualmente?
c
struct
initialization
hari
fonte
fonte
memset
se eu só quiser redefinir tudo para0
??memset
me faz sentir suja. Prefiro deixar o compilador se preocupar com o layout da memória sempre que possível. Estritamente falando, esse uso dememset
não é portátil, mas na prática eu ficaria surpreso se você compilasse seu código em qualquer lugar que importasse. Portanto, você provavelmente pode usar o memset com segurança, se preferir.A maneira de fazer isso quando você tem um C moderno (C99) é usar um literal composto .
Isso é um pouco semelhante à solução de David, só que você não precisa se preocupar em declarar uma estrutura vazia ou se deve declará-la
static
. Se você usar oconst
como eu fiz, o compilador ficará livre para alocar o literal composto estaticamente no armazenamento somente leitura, se apropriado.fonte
{ 0 }
como o inicializador padrão. Desligue esse aviso, é um alarme falso espúrio.Melhor do que tudo acima, é sempre usar a especificação C padrão para inicialização da estrutura:
Aqui estão todos os bits zero (sempre).
fonte
{}
em C ++. Os desenvolvedores do gcc parecem inseguros se o C ++ deve suportar{0}
e não estou familiarizado com essa parte do padrão.{0}
ou{}
. Não tenho certeza se os padrões C e C ++ são claros e em sincronia neste assunto, mas aparentemente, os compiladores não estão.struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
Em C, é um idioma comum zerar a memória para um
struct
usandomemset
:Tecnicamente falando, não acredito que isso seja portátil porque pressupõe que o
NULL
ponteiro em uma máquina seja representado pelo valor inteiro 0, mas é amplamente usado porque na maioria das máquinas é esse o caso.Se você mudar de C para C ++, tome cuidado para não usar essa técnica em todos os objetos. C ++ só torna isso válido em objetos sem funções de membro e sem herança.
fonte
Se você tiver um compilador compatível com C99, você pode usar
caso contrário, você deve fazer o que David Heffernan escreveu, ou seja, declarar:
E no circuito:
fonte
Você pode usar
memset
com o tamanho da estrutura:fonte
memset
é uma opção, mas ao usá-lo, você deve ter certeza de que a memória gravada é exatamente do mesmo tamanho que o terceiro parâmetro, por isso é melhor se referir ao tamanho do objeto real, não o tamanho do tipo que você sei que atualmente é. IOWmemset (&x_instance, 0, sizeof(x_instance));
é uma escolha muito melhor. BTW: o(void*)
elenco é supérfluo em C ++ também.Eu acredito que você pode simplesmente atribuir o conjunto vazio (
{}
) à sua variável.fonte
fonte
insira a descrição da imagem aqui Pegue uma surpresa de gnu11!
nada é zero.
fonte