我在valgrind中遇到错误,不知道出了什么问题。 错误是: valgrind输出:
==1112== Conditional jump or move depends on uninitialised value(s) ==1112== at 0x402BF0D: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
它说明问题发生在第226行:
if(reallocate ==TRUE)
{
char** temp_values = NULL;
temp_values = (char**) realloc(theBoard->_values, theBoard->_size_r*sizeof(char*) );
if(temp_values!=NULL)
{
theBoard->_values = temp_values;
} else
{
reportError(MEM_OUT);
return FALSE;
}
int i = 0;
for (i=0; i<theBoard->_size_r; i++)
{
char* temp_values_c = NULL;
HERE( line 226)-> temp_values_c = realloc(theBoard->_values[i], theBoard->_size_c*sizeof(char) );
if(temp_values_c != NULL)
{
theBoard->_values[i] = temp_values_c;
} else
{
reportError(MEM_OUT);
return FALSE;
}
}
// initialize extra memory
if(row_out_bound)
{
init(theBoard,prev_size_r,0);
}
if(col_out_bound)
{
init(theBoard,0, prev_size_c);
}
}
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:6)
问题是theBoard->_values[i]
未初始化,因为它直接来自realloc
(temp_values = ...
)。
你能详细说明吗?
我以为你永远不会问。函数realloc
返回指定大小的内存块,但不保证其内容。因此,出于所有实际目的,您应该假设任何realloc
返回包含垃圾。在你的代码中你获取那个(潜在的)垃圾并在线226
你告诉realloc:
这个指针就像完全有效一样。它是NULL
或我之前从malloc
获得的。你可以将它重新分配到这个大小吗?这不是真的! theBoard->_values[i]
包含的实际值可以是任何值。
你想要的是一个循环theBoard->_values[i] = NULL
,或者在第226行使用malloc
代替realloc
。