бесплатный 2d массив (матрица) структуры с именем "cell", где каждый из них является членом строки (char *) - PullRequest
0 голосов
/ 31 августа 2018

Распределение:

cell **initBoard(int boardSize)
{
    int i, j, k;
    cell **matrix;
    matrix = (cell **) malloc((boardSize + 1) * sizeof(cell *));

    // init upper frame
    matrix[0] = (cell *) malloc((boardSize + 1) * sizeof(cell));
    matrix[0][0].type = (char *) malloc(3 * sizeof(char));
    matrix[0][0].type[0] = ' ';

    for (k = 1; k <= boardSize; k++)
    {
        // +1 for null char ?
        matrix[0][k].type = (char *) malloc(3 * sizeof(char));
        matrix[0][k].type = arrNo[k - 1];
    }

    // init inner rows
    for (i = 1; i <= boardSize; i++)
    {
        matrix[i] = (cell *) malloc((boardSize + 1) * sizeof(cell));

        // first letter each row
        matrix[i][0].type = (char *) malloc(3 * sizeof(char));
        matrix[i][0].type[0] = (char) (BASE_ALPHABET + i);

        // init cols
        for (j = 1; j <= boardSize; j++)
        {
            matrix[i][j].type = (char *) malloc(2 * sizeof(char) + 1);
            matrix[i][j].type[0] = EMPTY;
            matrix[i][j].type[1] = WATER; // default status
            matrix[i][j].hidesShip = NULL;
        }
    }
    return matrix;
}

Распределения:

void freeMatrix(cell **matrix, int boardSize)
{
    int k, l;
    for (k = 0; k <= boardSize; k++)
    {
        for (l = 0; l <= boardSize; l++)
        {
            free(matrix[k][l].type);
        }
        free(matrix[k]);
    }
    free(matrix);
}

Я запустил приведенный выше код (показаны malloc + free), а затем проверил утечку памяти с помощью Valgrind и получил следующий вывод:

Журнал Valdrind Есть идеи, что я здесь делаю не так? Вальгринд означает, что я выполнил еще одну бесплатную команду? Я не могу видеть, где именно, потому что я перебрал все клетки .. может быть, здесь требуется лучшее понимание указателей? спасибо.

1 Ответ

0 голосов
/ 31 августа 2018
matrix[0][k].type = (char *) malloc(3 * sizeof(char));
matrix[0][k].type = arrNo[k - 1];

Проблема в том, что вы выделяете память и немедленно после записи в указатель, содержащий адрес. Вы больше не можете получить доступ к памяти, поэтому valgrind сообщает об этом как об утечке.

Вы, вероятно, хотели написать

    matrix[0][k].type[0] = arrNo[k - 1];

Если предположить, что arrNo - это массив символов, первое присваивание будет недопустимым, поскольку вы присваиваете char для char *. Ваш компилятор должен был дать вам предупреждение.

...