开发者

Conditional jump or move depends on uninitialised value(s)

开发者 https://www.devze.com 2023-03-28 11:25 出处:网络
I\'ve been struggling with this problem for a while now, searching every possible solution. I\'m new to C so I\'ts hard. I know I have some variable uninitialized, but I can\'t find them. I am trying

I've been struggling with this problem for a while now, searching every possible solution. I'm new to C so I'ts hard. I know I have some variable uninitialized, but I can't find them. I am trying to print a matrix. Here's the constructor:

BoardP createNewBoard(int width, int high)
{  

    BoardP board = (BoardP) malloc(sizeof(Board));

    if (board == NULL)
    {
        reportError(MEM_OUT);
        return NULL;
    }
    board->height = high;
    board->width = width;
    board->board = (char**) malloc(high * sizeof(char*));
    int i;
    for (i=0; i<high; i++)
    {
        board->board[i] = (char*) malloc(width * sizeof(char));
        if (board->board[i] == NULL)
        {
            freeTempBoard(board,i);
            return NULL;
        }
    }

    return board;
}

The constructor returns BoardP, a pinter to Board, which is:

typedef struct Board
{
    int width;
    int height;
    char **board;
} Board;

Now I fail trying to print the board->board. I loop over the matrix and for each cell I call this function:

static void printChar(ConstBoardP board, int X, int Y)
{
    if (X>=board->height || Y>=board->width)
    {
        printf(" ");
    }
    else
    {
        printf("%c ",board->board[X][Y]); //!!THIS IS LINE 299 IN Board.c!!
    }
}

And fianlly here's the error I get:

==4931== Conditional jump or move depends on uninitialised value(s)
==4931==    at 0x4E973D9: _IO_file_overflow@@GLIBC_2.2.5 (fileops.c:880)
==4931==    by 0x4E6F01B: vfprintf (vfprintf.c:1614)
==4931==    by 0x4E75879: printf (printf.c:35)
==4931==    by 0x400D91: printChar (Board.c:299)
开发者_C百科==4931==    by 0x400CED: printBoard (Board.c:284)
==4931==    by 0x400F1A: main (PlayBoard.c:19)
==4931== 
==4931== Conditional jump or move depends on uninitialised value(s)
==4931==    at 0x4E97401: _IO_file_overflow@@GLIBC_2.2.5 (fileops.c:887)
==4931==    by 0x4E6F01B: vfprintf (vfprintf.c:1614)
==4931==    by 0x4E75879: printf (printf.c:35)
==4931==    by 0x400D91: printChar (Board.c:299)
==4931==    by 0x400CED: printBoard (Board.c:284)
==4931==    by 0x400F1A: main (PlayBoard.c:19)
==4931== 
==4931== Conditional jump or move depends on uninitialised value(s)
==4931==    at 0x4E6F025: vfprintf (vfprintf.c:1614)
==4931==    by 0x4E75879: printf (printf.c:35)
==4931==    by 0x400D91: printChar (Board.c:299)
==4931==    by 0x400CED: printBoard (Board.c:284)
==4931==    by 0x400F1A: main (PlayBoard.c:19)

Now there's another file that calls createNewBoard, and then create printBoard(newBoard,0,0). The only thing that could possibly be uninitialized is board->board, other then that I have no ideas. I don't know how to debug it. I know its a lot of text, but I can't find the problem. Any idea would be much appreciated


Try:

for (i=0; i<high; i++)
{
    board->board[i] = (char*) malloc(width * sizeof(char));
    /* ... */
    memset(board[i], 0, width);
}


malloc does not initialize the memory, so this:

printf("%c ",board->board[X][Y]);

might be uninitialized. Use calloc instead or add memset after

board->board[i] = (char*) malloc(width * sizeof(char));


At the line:

board->board[i] = (char*) malloc(width * sizeof(char));

...you allocate space for the board row, but you never actually initialise the values in this array. Use memset(board[i], 0, width) or explicitly loop over the array to set the values.

(Also, as a matter of style, you don't need to cast malloc's return value.)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号