0

次のコードを使用して初期化しようとしているこの構造があります。「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() と同じです

4

3 に答える 3

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

の最後の文字をfing_printポインタとして扱い、それに書き込もうとしています。おそらくあなたは次のことを意味しました:

strcpy((char*)ht[j][k].fing_print,(const char*)garb);
于 2012-02-27T13:53:26.300 に答える
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';
于 2012-02-27T13:54:07.643 に答える
0

その発言strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);は意味がありません。配列の要素 32 を取り、それをfing_printアドレスとして解釈し、そのアドレスに の内容を書き込もうとします ( 0 のみを含み、 によって長さ 0 の文字列と見なされるgarbため、副作用はまったくないはずです) 。 .garbstrcpy()

ht[j][k].fing_printすべてゼロに設定する場合は、 を使用しますmemset(ht[j][k].fing_print, 0, sizeof(ht[j][k].fing_print))

于 2012-02-27T13:58:44.770 に答える