【发布时间】: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 的 bzero 将 deg "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 实际上是指向nints 的 int 指针,而不是n字节。 -
@Barmar 感谢您帮助我找出问题所在。我不需要将整个内容归零,但我只是将最后一个
4*n中的n字节归零,而不是将整个4*n归零。
标签: c gcc memory-management valgrind