Неинициализированные значения в динамическом массиве в C - PullRequest
0 голосов
/ 01 декабря 2018

Мне дали задание, для которого требуется динамический 2D-массив в C, но мы еще даже не рассмотрели указатели, поэтому я немного растерялся.Я должен прочитать какой-нибудь текстовый ввод и сохранить его в 2D-массиве, не ограничивая его размер.К сожалению, Valgrind продолжает выдавать мне сообщение о том, что существует неинициализированное значение, когда выполняется функция put (), а иногда она выводит некоторые случайные знаки.Я понимаю, что, должно быть, я опустил некоторые индексы, но я просто не могу найти, откуда возникла проблема.Кроме того, все советы относительно качества моего кода очень ценятся.

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <assert.h>


#define MULT 3
#define DIV 2


char **read(int *row, int *col) {
    char **input = NULL;
    int row_size = 0;
    int col_size = 0;
    int i = 0;
    int c;

    while ((c = getchar()) != EOF) {
        if (c != '\n') { // skip empty lines

            assert(i < INT_MAX);
            if (i == row_size) { // if not enough row memory, allocate more
                row_size = 1 + row_size * MULT / DIV;
                input = realloc(input, row_size * sizeof *input);
                assert(input != NULL);
            }

            char *line = NULL;
            int j = 0;
            // I need all the rows to be of the same size (see last loop)
            line = malloc(col_size * sizeof *line); 

            // do while, so as to not skip the first character
            do { 
                assert(j < INT_MAX-1);
                if (j == col_size) {
                    col_size = 1 + col_size * MULT / DIV;
                    line = realloc(line, col_size * sizeof *line);
                    assert(line != NULL);
                }
                line[j++] = c;
            } while(((c = getchar()) != '\n') && (c != EOF));

            // zero-terminate the string
            if (j == col_size) {
                ++col_size;
                line = realloc(line, col_size * sizeof *line);
                line[j] = '\0';
            }

            input[i++] = line;
        }
    }
    // Here I give all the lines the same length
    for (int j = 0; j < i; ++j)
        input[j] = realloc(input[j], col_size * sizeof *(input+j));

    *row = i;
    *col = col_size;
    return input;
}


int main(void) {
    int row_size, col_size, i, j;
    char **board = read(&row_size, &col_size);

    // Initialize the remaining elements of each array
    for (i = 0; i < row_size; ++i) {
        j = 0;
        while (board[i][j] != '\0')
            ++j;
        while (j < col_size-1)
            board[i][++j] = ' ';
    }

    for (i = 0; i < row_size; ++i) {
        puts(board[i]);
    }

    for (i = 0; i < row_size; ++i)
        free(board[i]);
    free(board);

    return 0;
}
...