c - valgrind 不理解 bzero

标签 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 的 bzerodeg“数组”中的值初始化为 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(deg, n * sizeof(int));

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

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

关于c - valgrind 不理解 bzero,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13674514/

相关文章:

C flash文件系统使用fwrite生命周期有限制吗?

c - printf中的前自增和后自增

c - 如何从控制台获取线程调度策略

c - malloc 应该被赋予指针大小或内存大小?

c - Variadic 宏扩展出错了

iphone - XCode4 不显示 "C/C++ Compiler Version"选项

linux - Lubuntu 上的 gcc 无法正常工作

java - 当内存占用超过一定阈值时强制进行全面垃圾回收

c - C中的for循环用于从文本文件中读取序列号

iPhone内存管理(附具体例子/问题)