未初始化的结构成员:最佳实践

时间:2013-08-20 20:06:37

标签: c initialization

在我的代码中,我有一个这样的结构:

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}}预先简化为零字节是最好的主意吗?

5 个答案:

答案 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) {