首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未初始化的值是在调用不同函数时由堆分配创建的。

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

Stack Overflow用户
提问于 2017-08-29 07:50:24
回答 1查看 6.2K关注 0票数 0

守则如下:

代码语言:javascript
复制
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");
    }
}

从main这样呼叫时:

代码语言:javascript
复制
Board *final = constructBoard(4);
printBoard(final, SEPARATOR);
freeBoard(final);

结果出现以下val差错率错误(请参阅上面代码中的注释中的错误行):

代码语言:javascript
复制
==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的定义

代码语言:javascript
复制
typedef struct Board
{
    int** matrix;
    int dimension;
    unsigned int value;
} Board;

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

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

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

  1. Uninitialised value was created by a stack allocation
  2. Uninitialised value was created by a stack allocation - valgrind
  3. Uninitialised value was created by a stack allocation

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

代码语言:javascript
复制
gcc -g -c -Wextra -Wall -Wvla -DNDEBUG -std=c99
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-29 07:54:32

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

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

如果您想初始化内存,那么要么显式地执行它,要么使用calloc来分配和“清除”(零)内存(它等同于malloc,然后是memset)。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45933532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档