c-未初始化的值是在调用不同函数时由堆分配创建的



下面的代码:

Board* constructBoard(int dimension)
{
//Allocate memory for board
Board *board = malloc(sizeof(Board));
if(!board)
{
return NULL;
}
//Allocate memory for matrix
board->matrix = malloc(dimension * sizeof(int*));
if(!board->matrix)
{
freeBoard(board);
return NULL;
}
//Allocate memory for each row of matrix
for(int row = 0; row < dimension; row++)
{
// Following line is line 29 from error below  <---------------------------
board->matrix[row] = malloc(dimension * sizeof(int));  
if(!board->matrix[row])
{
freeBoard(board);
return NULL;
}
board->dimension = row +1;
}
board->value = 0;
return board;
}
void printBoard(Board *board, char* delimiter)
{
assert(board && "printBoard must get an initialized board");
for(int i = 0; i < board->dimension; i++)
{
for (int j = 0; j < board->dimension; j++)
{
printf("%d%s", board->matrix[i][j], delimiter);
}
printf("n");
}
}

当从主目录调用时,如下所示:

Board *final = constructBoard(4);
printBoard(final, SEPARATOR);
freeBoard(final);

导致以下valgrind错误(参见上面代码中的错误行注释(:

==8450==  Uninitialised value was created by a heap allocation
==8450==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8450==    by 0x401560: constructBoard (Board.c:29)
==8450==    by 0x400FAB: main (SudokuSolver.c:181)

Board:的定义

typedef struct Board
{
int** matrix;
int dimension;
unsigned int value;
} Board;

当我不将调用添加到printBoard时,一切都很好。

  1. 为什么只有在使用printBoard时才会出现错误
  2. 为什么当我得到错误时,它说它在constructBoard

我已经读过这些以前的问题,但我仍然没有设法解决它,因为我正确地分配了内存,并确保循环只迭代有效的索引:

  1. 未初始化的值由堆栈分配创建
  2. 未初始化的值由堆栈分配创建-valgrind
  3. 未初始化的值是由堆栈分配创建的

我使用以下标志进行编译:

gcc -g -c -Wextra -Wall -Wvla -DNDEBUG -std=c99

malloc函数只分配内存,不会以任何方式初始化该内存。内存的内容是不确定的。

您在printBoard函数中打印此未初始化内存的内容,从而得到警告。

如果要初始化内存,则显式执行,或者使用calloc分配并"清除"(零(内存(相当于malloc后面跟着memset(。

最新更新