valgrind不懂bzero

时间:2012-12-02 22:16:28

标签: c gcc memory-management valgrind

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

// 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“数组中的值初始化为0(adj”数组“不需要初始化因为我在读它之前写了它。这工作正常,我的程序运行成功,但每当我从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中会遇到相同的错误。

1 个答案:

答案 0 :(得分:6)

您应该使用:

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

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

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