Мой динамически размещенный 2D-массив не будет печататься - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь использовать функцию для создания двумерного массива символов, установить для всех символов символ x и вывести первые 10 строк, чтобы проверить, правильно ли это было сделано.

Мой код компилируется с использованием:gcc -std = c89 -pedantic code.c Однако, когда я пытаюсь запустить код с помощью ./a.out, я получаю ошибку сегментации.

Я выделил проблему, когда пытаюсь напечатать своймассив, поскольку нет ошибки сегментации, когда строка printf("%c", a[i][j]); закомментирована.

#define rows 100
#define columns 3

char** makeArr(int rows, int columns)
{
    int temp,i,j;
    char** a = (char**)malloc(rows*sizeof(char*));
    for(temp = 0; temp < rows; temp++)
    {
        a[temp]=(char*)malloc(columns*sizeof(char));
    }

    memset(a, 'x', rows*columns*sizeof(a[0][0]));

    for(i = 0; i < 10; i++)
    {
        for(j = 0; j < columns; j++)
        {
            printf("%c", a[i][j]);
        }
        printf("\n");
    }

    return a;
}

Любая помощь в решении этой проблемы будет принята с благодарностью, и если понадобится какой-либо дополнительный контекст, просто дайте мне знать.

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Вы можете выделить массив как непрерывный блок:

char (*arr)[COLUMNS] = malloc(sizeof *arr * ROWS);
memset(arr, 'x', sizeof *arr * ROWS);

Вызов memset выходит за пределы выделенного массива a:

memset(a, 'x', rows*columns*sizeof(a[0][0]));

Массив состоит из char* указателей и содержит rows элементов. Поскольку вы распределяете подмассивы индивидуально, вам понадобятся отдельные вызовы memset для каждого malloc d указателя. Предполагая, что строки имеют фиксированную длину, было бы проще выделить хранилище как один непрерывный блок.

1 голос
/ 03 июля 2019

Самое простое решение - сделать memset в том же цикле, в котором вы malloc строки:

for(temp = 0; temp < rows; temp++) {
    a[temp] = malloc(columns*sizeof(char));
    memset(a[temp], 'x', columns);
}

Обратите внимание, что я не умножаю columns * sizeof(a[0][0]).sizeof(a[0][0]) - это размер char в байтах, поэтому обычно 1. Если вы сделаете columns * sizeof(a[0][0]), это все равно будет работать в большинстве систем, но при практическом использовании вам это действительно не нужно, поскольку sizeof(char)почти универсально 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...