2012-02-27 6 views
0

У меня есть эта структура, которую я пытаюсь инициализировать, используя следующий код. Он получает ошибку времени выполнения при попытке инициализировать «finger_print»strcpy() создает ошибку

Что в этом плохого?

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()

ответ

3
strcpy((char*)ht[j][k].fing_print[32],(const char*)garb); 

Вы лечащему последний символ fing_print как указатель и пытается писать в него , Возможно, вы имели в виду:

strcpy((char*)ht[j][k].fing_print,(const char*)garb); 
1

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'; 
+0

Еще лучше '#define РАЗМЕР 33' и' SIZE-1' – zmccord

+0

@zmccord: Согласен. Хотя функция 'strcpy' - это вопрос, о котором идет речь. – LihO

+0

@zmccord: Также '#define SIZE 32' и' SIZE + 1' в декларации гораздо более интуитивно понятны. – LihO

0

Заявление strcpy((char*)ht[j][k].fing_print[32],(const char*)garb); не имеет смысла. Он принимает элемент 32 массива fing_print, интерпретирует его как адрес и пытается записать содержимое garb на этот адрес (который не должен иметь никакого побочного эффекта вообще, потому что garb содержит только нули и рассматривается как длина 0 строка strcpy()).

Если вы хотите установить ht[j][k].fing_print на все нули, используйте memset(ht[j][k].fing_print, 0, sizeof(ht[j][k].fing_print)).

 Смежные вопросы

  • Нет связанных вопросов^_^