【问题标题】:valgrind does not understand bzerovalgrind 不理解 bzero
【发布时间】:2012-12-02 22:16:27
【问题描述】:

我正在为两个我将其视为数组的指针分配足够的内存:

// Allocate memory for both adj and deg
int *adjdeg = malloc(sizeof(int)*n*n);

adj = adjdeg;
deg = adjdeg + n*n - n;

然后我使用来自 string.h 的 GNU 的 bzerodeg "array" 中的值初始化为 0(adj "array" 不需要初始化,因为我写信给它在我读到它之前)。这工作正常,我的程序运行成功,但是每当我从deg(IE.deg[0])读取时,valgrind 都会报告许多关于使用初始化值的错误。这是我给bzero的电话:

// My bzero call
bzero(deg, n);

如果我删除对 bzero 的调用并使用如下循环,valgrind 会很高兴:

int i; 
for(i = 0; i < n; i++)
    deg[i] = 0;

有没有办法告诉 valgrind bzero 正在正确地初始化内存中的那个区域?我正在使用 gcc 4.6.3 和 valgrind 3.7.0

注意:如果我使用 memset 而不是 bzero,我会在 valgrind 中遇到相同的错误。

【问题讨论】:

  • 有趣,bzero 一定是在做一些完全不同的事情。
  • 您分配了4*n*n 字节,但仅将第一个n 字节归零。如果您将整件事归零,警告会消失吗?
  • 那么错误一定在别处。试试memset(adjdeg, 0, sizeof(int) * n * n);
  • 啊,我才意识到出了什么问题。我应该使用 bzero(deg, sizeof(int)*n);,因为 deg 实际上是指向 n ints 的 int 指针,而不是 n 字节。
  • @Barmar 感谢您帮助我找出问题所在。我不需要将整个内容归零,但我只是将最后一个 4*n 中的 n 字节归零,而不是将整个 4*n 归零。

标签: c gcc memory-management valgrind


【解决方案1】:

你应该使用:

bzero(deg, n * sizeof(int));

实际上,您正在初始化 n 字节,而不是 n 整数。为了获得最大的可移植性,您可能应该使用memset() 而不是bzero(),但您仍然需要在大小中使用sizeof(int) 乘数:

memset(deg, '\0', n * sizeof(int));

【讨论】:

  • +1 表示memsetbzero 在 POSIX 2001 中已弃用,在 POSIX 2008 中不存在。memset 是 ISO C 中的标准,自 1989 年以来一直是。
猜你喜欢
  • 2011-12-03
  • 2014-10-06
  • 2020-12-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
相关资源
最近更新 更多