2012-02-27 3 views
0

J'ai cette structure que j'essaie d'initialiser en utilisant le code suivant. Il obtient une erreur d'exécution lors de l'initialisation de "finger_print"strcpy() crée une erreur

Qu'est-ce qui ne va pas?

typedef struct fpinfo 
{ 
    unsigned long chunk_offset; 
    unsigned long chunk_length; 
    unsigned char fing_print[33]; 

}fpinfo; 

la fonction:

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]; 
} 

Il en est de même strncpy()

Répondre

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

Vous traitez le dernier caractère de fing_print comme pointeur et essayant d'y écrire . Peut-être que vous vouliez dire:

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

Utilisez strncpy si vous souhaitez spécifier le nombre de caractères qui doivent être copiés. Remplacer ces lignes:

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

avec ces:

strncpy((char*)ht[j][k].fing_print, (const char*)garb, 32); 
ht[j][k].fing_print[32] = '\0'; 
+0

Mieux encore '#define SIZE 33' et' SIZE-1' – zmccord

+0

@zmccord: D'accord. Bien que la fonctionnalité de 'strcpy' soit la fonction de cette question. – LihO

+0

@zmccord: De même, '#define SIZE 32' et' SIZE + 1' dans la déclaration est beaucoup plus intuitif. – LihO

0

La déclaration strcpy((char*)ht[j][k].fing_print[32],(const char*)garb); n'a pas de sens. Il prend l'élément 32 du tableau fing_print, l'interprète comme une adresse et essaie d'écrire le contenu de garb à cette adresse (qui ne devrait avoir aucun effet secondaire, car garb ne contient que des zéros, et est considéré comme une longueur 0 chaîne par strcpy()). Si vous souhaitez définir ht[j][k].fing_print sur tous les zéros, utilisez memset(ht[j][k].fing_print, 0, sizeof(ht[j][k].fing_print)).