c:valgrind“条件跳转或移动取决于未初始化的值”

时间:2012-12-04 18:22:53

标签: c valgrind

我在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);
    }

}

为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:6)

问题是theBoard->_values[i]未初始化,因为它直接来自realloctemp_values = ...)。

修改

  

你能详细说明吗?

我以为你永远不会问。函数realloc返回指定大小的内存块,但不保证其内容。因此,出于所有实际目的,您应该假设任何realloc返回包含垃圾。在你的代码中你获取那个(潜在的)垃圾并在线226你告诉realloc:

这个指针就像完全有效一样。它是NULL或我之前从malloc获得的。你可以将它重新分配到这个大小吗?这不是真的! theBoard->_values[i]包含的实际值可以是任何值。

你想要的是一个循环theBoard->_values[i] = NULL,或者在第226行使用malloc代替realloc