0

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

struct fileinfo {
    /* ... */
    bool hashed;
    char hash[20];
}

处理 a 的每个函数struct fileinfo只读取设置的hashif 且仅 ifhashed的值。我的程序将其中几个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;
}

Valgrind 现在抱怨我将未初始化的内存传递给系统调用write。处理这种情况的最佳做法是什么?事先memset将成员简单地设置为零字节是最好的主意吗?hash

4

5 回答 5

7

我通常memset在使用之前只是整个事情。

memset( &info, 0, sizeof(info) );
于 2013-08-20T20:08:11.277 回答
5

使用默认初始化{ 0 }程序自动初始化 to的所有字段。struct0

struct stat没有完全控制的领域或任何其他领域没有问题。如果您提供初始化程序,所有省略的字段都会0自动初始化。

memset不(完全)相同。如果您有指针或浮点字段,它可能不适合某些架构。

如果您在使用默认初始化程序时编译器对您进行模糊处理(gcc 默认使用-Wall),您可以使用从 C99 开始的指定初始化程序,用于您知道具有相同效果的字段

struct fileinfo info = { .hashed = false, };
于 2013-08-20T21:18:56.410 回答
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 */
  }
}
于 2013-08-20T20:36:23.293 回答
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) {
于 2013-08-20T22:36:48.100 回答
0

Valgrind 的抱怨是你可以忽略的。这是一个工具(实际上工具),但您是程序员,如果您知道自己在做什么,则可以忽略任何警告。

我不会推荐它。许多虫子就是这样诞生的。

于 2013-08-20T20:09:37.253 回答