strcpy() создает ошибку
-
13-11-2019 - |
Вопрос
У меня есть структура, которую я пытаюсь инициализировать, используя следующий код.При попытке инициализировать «finger_print» возникает ошибка времени выполнения.
Что с этим не так?
typedef struct fpinfo
{
unsigned long chunk_offset;
unsigned long chunk_length;
unsigned char fing_print[33];
}fpinfo;
функция:
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];
}
То же самое и с strncpy().
Решение
strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
Вы рассматриваете последний символ fing_print
как указатель и попытка записи в него.Возможно, Вы имели в виду:
strcpy((char*)ht[j][k].fing_print,(const char*)garb);
Другие советы
Используйте strncpy Если вы хотите указать количество символов, которые должны бытьскопирован.Заменить эти линии:
strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
//ht[j][k].fing_print[32]=0;
.
с этим:
strncpy((char*)ht[j][k].fing_print, (const char*)garb, 32);
ht[j][k].fing_print[32] = '\0';
. Заявление strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
не имеет смысла.Требуется элемент 32 из fing_print
массив, интерпретирует его как адрес и пытается записать содержимое garb
по этому адресу (что вообще не должно иметь побочного эффекта, потому что garb
содержит только нули и рассматривается как строка нулевой длины strcpy()
).
Если вы хотите установить ht[j][k].fing_print
до всех нулей, используйте memset(ht[j][k].fing_print, 0, sizeof(ht[j][k].fing_print))
.