strcpy() crea error
-
13-11-2019 - |
Pregunta
Tengo esta estructura de la que estoy tratando de inicializar utilizando el siguiente código.Se pone error de tiempo de ejecución cuando se intenta inicializar "finger_print"
Lo que está mal con él?
typedef struct fpinfo
{
unsigned long chunk_offset;
unsigned long chunk_length;
unsigned char fing_print[33];
}fpinfo;
la función:
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];
}
Es el mismo con strncpy()
Solución
strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
Se está tratando de que el último carácter de fing_print
como un puntero, y tratando de escribir en él.Quizás quiso decir:
strcpy((char*)ht[j][k].fing_print,(const char*)garb);
Otros consejos
Use strncpy Si desea especificar el número de caracteres que deben sercopiado.Reemplace estas líneas:
strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
//ht[j][k].fing_print[32]=0;
con estos:
strncpy((char*)ht[j][k].fing_print, (const char*)garb, 32);
ht[j][k].fing_print[32] = '\0';
La declaración de strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
no tiene sentido.Se tarda elemento 32 de la fing_print
matriz, se interpreta como una dirección, y trata de escribir el contenido de garb
a esa dirección (que debe tener ningún efecto secundario en absoluto, porque garb
sólo contiene ceros, y es considerado como un 0-longitud de la cadena strcpy()
).
Si desea establecer ht[j][k].fing_print
para todos los ceros, el uso de memset(ht[j][k].fing_print, 0, sizeof(ht[j][k].fing_print))
.