【发布时间】:2015-04-04 17:46:02
【问题描述】:
我试图通过分配所需的内存加 1 并将最后一个元素设置为 -1 来获取 C 中整数数组的大小。然后我创建了一个名为 getSize 的函数来确定数组中这个 -1 元素之前的元素数量,这是代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getSize(int * array)
{
int i=0;
while(1)
{
if(array[i] == -1) return i;
else i++;
}
}
int main()
{
int * array = malloc(sizeof(int)*5);
memset(array,0,5);
array[4] = -1;
printf("\nsize = %d\n",getSize(array));
return 0;
}
这只是一个测试代码,但函数 getSize 是更大代码的一部分,我在这段代码上运行了 valgrind,这就是我遇到的问题:
==1683== 条件跳转或移动取决于未初始化的值
==1683== 在 0x100000EAE: getSize (in ./a.out)
==1683== by 0x100000F2E: main (in ./a.out)
总结如下:
==1683== 堆摘要:
==1683== 在退出时使用:425 个块中的 38,676 个字节
==1683== 总堆使用量:508 次分配,83 次释放,44,948 字节分配泄漏摘要:
==1683== 肯定丢失:2 个块中的 36 个字节
==1683== 间接丢失:0 个块中的 0 个字节
==1683== 可能丢失:119 个块中的 13,130 个字节
==1683== 仍然可以访问:304 个块中的 25,510 个字节
==1683== 抑制:0 个块中的 0 个字节
==1683== 错误摘要:来自 20 个上下文的 22 个错误(抑制:0 来自 0)
【问题讨论】:
-
memset()以字节为单位,你需要memset(array, 0, 5*sizeof(int))。 -
更正了 memset 但仍然存在同样的问题。
-
所有问题都还存在吗?您可以在
printf()之后通过free()ingarray来消除内存泄漏,但应该修复未初始化的警告。你重新编译了吗?