我有这个结构,我试图使用以下代码初始化。尝试初始化“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()
相同答案 0 :(得分: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 :(得分: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';
答案 2 :(得分:0)
声明strcpy((char*)ht[j][k].fing_print[32],(const char*)garb);
没有意义。它需要fing_print
数组的元素32,将其解释为一个地址,并尝试将garb
的内容写入该地址(这应该没有任何副作用,因为garb
仅包含零,并被strcpy()
)视为0长度的字符串。
如果您想将ht[j][k].fing_print
设置为全零,请使用memset(ht[j][k].fing_print, 0, sizeof(ht[j][k].fing_print))
。