在我的代码中,我有一个这样的结构:
struct fileinfo {
/* ... */
bool hashed;
char hash[20];
}
处理struct fileinfo
的每个函数仅在hash
设置为hashed
时才会读取struct fileinfo
的值。我的程序将这些struct fileinfo info;
/* ... */
info.hashed = false;
/* ... */
if (fwrite(&info,sizeof info,1,m->info_file) != 1) {
perror("Error writing to temporary file");
return 1;
}
中的几个写入临时文件中以供以后使用:
write
Valgrind现在抱怨我将未初始化的内存传递给系统调用memset
。处理此类案件的最佳做法是什么?将hash
成员{{1}}预先简化为零字节是最好的主意吗?
答案 0 :(得分:5)
在使用之前,我通常只是memset
。
memset( &info, 0, sizeof(info) );
答案 1 :(得分:4)
使用默认初始值设定工具{ 0 }
自动将struct
的所有字段初始化为0
。
struct stat
字段或您无法完全控制的任何其他字段没有问题。如果您提供初始化程序,则所有省略的字段都会自动0
初始化。
memset
不完全相同。如果您有指针或浮点字段,它可能不适合某些体系结构。
如果您的编译器在使用默认的iniatilizer(gcc默认使用-Wall
时)时会对您产生影响,您可以使用C99的指定初始化程序来表示您知道具有相同效果的字段
struct fileinfo info = { .hashed = false, };
答案 2 :(得分:0)
Valgrind的抱怨是你无视的。这是一个工具(实际上是 工具),但是你是程序员而如果你知道你在做什么,你可以忽略任何警告。
我不会推荐它。许多错误就是这样诞生的。
答案 3 :(得分:0)
void set_file_info(struct fileinfo info, bool hashed, char *hashval)
{
if (hashed == true){
info.hashed = true;
strcpy(info.hash,hashval);
} else {
info.hashed = false;
memset(info.hash, 0, HASH_SIZE); /* HASH_SIZE = 20 */
}
}
答案 4 :(得分:0)
我喜欢{ 0 }
个答案,但是如果你想让info.hash保持未初始化状态,不要写那个结构。
struct fileinfo izero = { 0 };
struct fileinfo *ptr = info.hashed ? &info : &zero;
if (fwrite(ptr, sizeof *ptr, 1, m->info_file) != 1) {