c:valgrind“;条件跳转或移动取决于未初始化的值;
我在valgrind遇到了一个错误,不知道出了什么问题。 错误是: valgrind输出: 它指出问题发生在第226行:c:valgrind“;条件跳转或移动取决于未初始化的值;,c,valgrind,C,Valgrind,我在valgrind遇到了一个错误,不知道出了什么问题。 错误是: valgrind输出: 它指出问题发生在第226行: if(reallocate ==TRUE) { char** temp_values = NULL; temp_values = (char**) realloc(theBoard->_values, theBoard->_size_r*sizeof(char*) ); if(temp_values!=NULL) {
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);
}
}
if(重新分配==TRUE)
{
字符**临时值=空;
临时值=(字符**)realloc(电路板->\u值,电路板->\u大小*sizeof(字符*);
如果(临时值!=NULL)
{
电路板->温度值=温度值;
}否则
{
报告错误(MEM_OUT);
返回FALSE;
}
int i=0;
对于(i=0;i\u size\u r;i++)
{
char*temp_值_c=NULL;
这里(第226行)->temp_values_c=realloc(电路板->_values[i],电路板->_size_c*sizeof(char));
如果(临时值=NULL)
{
电路板->\u值[i]=温度值\u c;
}否则
{
报告错误(MEM_OUT);
返回FALSE;
}
}
//初始化额外内存
如果(行外)
{
初始值(板,上一个尺寸,0);
}
如果(列外界)
{
初始(板,0,上一个尺寸c);
}
}
为什么会发生这种情况?我如何解决它?问题是
电路板->\u值[i]
没有初始化,因为它直接来自realloc
(temp\u值=…
)
编辑
你能详细说明一下吗
我以为你不会问的。函数realloc
返回指定大小的内存块,但不保证其内容。因此,出于所有实际目的,您应该假设任何realloc
返回的内容都包含垃圾。在你的代码中,你接受了(潜在的)垃圾,并在第226行告诉realloc:
这是一个完全有效的指针。它是NULL
或者我以前从malloc
获得的。你能把它改成这个尺寸吗?那不是真的!theBoard->\u values[i]
包含的实际值可以是任何值
你想要的是一个循环,它执行
theBoard->\u values[i]=NULL
,或者可能使用malloc
而不是第226行的realloc
。问题是theBoard->\u values[i]
没有初始化,因为它直接来自realloc
(temp\u values=…
)
编辑
你能详细说明一下吗
我以为你不会问的。函数realloc
返回指定大小的内存块,但不保证其内容。因此,出于所有实际目的,您应该假设任何realloc
返回的内容都包含垃圾。在你的代码中,你接受了(潜在的)垃圾,并在第226行告诉realloc:
这是一个完全有效的指针。它是NULL
或者我以前从malloc
获得的。你能把它改成这个尺寸吗?那不是真的!theBoard->\u values[i]
包含的实际值可以是任何值
您需要的是一个循环,它执行
theBoard->\u values[i]=NULL
,或者可以使用malloc
而不是第226行上的realloc
。如果您使用--track origins=yes运行valgrind,它将告诉您冲突的变量以及它的分配位置。本周是否有valgrind更新?这是我在过去几天内遇到的第三个问题。如果使用--track origins=yes运行valgrind,它将告诉您冲突变量及其分配位置。本周是否有valgrind更新?这是我最近几天遇到的第三个问题,你能详细说明一下吗?我如何解决这个问题?我不能使用malloc,因为我想保留以前的值。我无法忍受你建议的第一个选项-在循环中做什么?@Tom嗯,在这种情况下,realloc
是无用的,因为board->\u values[I]是垃圾。在循环中,你可以说theBoard->\u values[i]=NULL
@Tom帮你修好了吗?你能详细说明一下吗?我如何解决这个问题?我不能使用malloc,因为我想保留以前的值。我无法忍受你建议的第一个选项-在循环中做什么?@Tom嗯,在这种情况下,realloc
是无用的,因为board->\u values[I]是垃圾。在循环中,你可以说theBoard->\u values[i]=NULL
@Tom帮你修好了吗?
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);
}
}