Pau*_*aul 1 c gcc valgrind memory-management
我为两个指针分配足够的内存,我将其视为数组:
// Allocate memory for both adj and deg
int *adjdeg = malloc(sizeof(int)*n*n);
adj = adjdeg;
deg = adjdeg + n*n - n;
Run Code Online (Sandbox Code Playgroud)
然后我使用bzero来自string.h的GNU 来将deg"数组"中的值初始化为0(adj"数组"不需要初始化它,因为我在读它之前就写了它).这工作正常,我的程序运行成功,但每当我从deg(IE.deg[0])读取时,valgrind报告许多关于使用初始化值的错误.以下是我的致电bzero:
// My bzero call
bzero(deg, n);
Run Code Online (Sandbox Code Playgroud)
如果我删除对bzero的调用并使用如下循环,valgrind很高兴:
int i;
for(i = 0; i < n; i++)
deg[i] = 0;
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉valgrind bzero正确地在内存中初始化该区域?我正在使用gcc 4.6.3和valgrind 3.7.0
注意:如果我用memset而不是,我在valgrind中得到相同的错误bzero.
你应该使用:
bzero(deg, n * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
实际上,你是在初始化n字节,而不是n整数.为了获得最大的可移植性,您应该使用memset()而不是bzero(),但仍需要sizeof(int)大小的乘数:
memset(deg, '\0', n * sizeof(int));
Run Code Online (Sandbox Code Playgroud)