strcpy() cria erro
-
13-11-2019 - |
Pergunta
Eu tenho essa estrutura que estou tentando inicializar usando o código a seguir.Ocorre um erro de tempo de execução ao tentar inicializar "finger_print"
O que está errado com isso?
typedef struct fpinfo
{
unsigned long chunk_offset;
unsigned long chunk_length;
unsigned char fing_print[33];
}fpinfo;
a função:
struct fpinfo* InitHTable(struct fpinfo ht[][B_ENTRIES])
{
unsigned char garb[33]={0};
for (int j = 0; j < BUCKETS; ++j)
{
for (int k = 0; k < B_ENTRIES; ++k)
{
ht[j][k].chunk_offset=0;
ht[j][k].chunk_length=0;
strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
//ht[j][k].fing_print[32]=0;
}
}
curr_tanker=1;
return &ht[0][0];
}
É o mesmo com strncpy()
Solução
strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
Você está tratando o último personagem de fing_print
como um ponteiro e tentando escrever nele.Talvez você quis dizer:
strcpy((char*)ht[j][k].fing_print,(const char*)garb);
Outras dicas
Usar forte se você deseja especificar o número de caracteres que devem ser copiados.Substitua estas linhas:
strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
//ht[j][k].fing_print[32]=0;
com estas:
strncpy((char*)ht[j][k].fing_print, (const char*)garb, 32);
ht[j][k].fing_print[32] = '\0';
A declaração strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
não faz sentido.Leva o elemento 32 do fing_print
array, interpreta isso como um endereço e tenta escrever o conteúdo de garb
para esse endereço (o que não deve ter nenhum efeito colateral, porque garb
contém apenas zeros e é considerada uma string de comprimento 0 por strcpy()
).
Se você quiser definir ht[j][k].fing_print
para todos os zeros, use memset(ht[j][k].fing_print, 0, sizeof(ht[j][k].fing_print))
.