0

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

}

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

4

1 回答 1

7

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

编辑

你能详细说明一下吗?

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

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

你想要的是一个循环theBoard->_values[i] = NULL,或者可能使用malloc而不是realloc第 226 行。

于 2012-12-04T18:25:09.017 回答