Как сделать массив двумерных символов полностью пустым? - PullRequest
3 голосов
/ 07 апреля 2019

Я создаю 2D-массив, используя malloc, и когда я перебираю массив, в нем появляются символы и символы, которые мне не нужны. Разве массив не должен быть полностью пустым?

Я пытался присвоить нулевой символ началу каждой строки, но это ничего не меняет.

    char **structure;
    structure = malloc(sizeof *structure * 2);
    if (structure) {
        for (size_t i = 0; i < 2; i++) {
            structure[i] = malloc(sizeof *structure[i] * 20);
            structure[i][0] = '\0';
        }
    }
    for (int i = 0; i <= 2; i++) {
        for (int j = 0; j < 20; j++) {
            printf("%c ", structure[i][j]);
        }
        printf("\n");
    }

Я ожидал, что выходные данные будут просто пробелами, но вот что появилось:

Z Ñ             P  Ñ             l   L O
Z Ñ               P  Ñ             N U M B

Ответы [ 4 ]

6 голосов
/ 07 апреля 2019

Вы должны использовать функцию calloc; это то, что я часто использую. Он выполняет ту же работу, что и malloc(), но инициализирует все выделенные биты с 0.

документация calloc

3 голосов
/ 07 апреля 2019

Когда вы получаете доступ к каждому персонажу, вы должны явно очистить все позиции, чтобы получить желаемый результат.

char **structure;
structure = (char**)malloc( (sizeof *structure) * 2 );
if (structure)
{
    for(size_t i = 0; i < 2; i++){
        // structure[i];
    structure[i] =(char *) malloc( sizeof *structure[i] * 20 );
    for(int j=0; j<20; j++)
        structure[i][j] = '\0';

    }
}
for(int i = 0; i < 2; i++){ //you can not access position i==2
        for(int j = 0; j < 20; j++)
        {
            printf("%c ", structure[i][j]);

        }
        printf("\n");
    }

Вы также можете использовать printf ("% s", структура [i]), чтобы он работал с вашим текущим кодом.это будет работать, потому что вы сделали первую позицию обеих строк NULL ('\ 0'). Таким образом, функция printf завершит работу для обоих символьных массивов, ничего не печатая.Но помните, что другая позиция, чем первая из обоих массивов, будет содержать значение мусора.

1 голос
/ 07 апреля 2019

Вы на самом деле не выделяете двумерный массив char, а массив из 2 указателей на массивы 20 char.Намного проще выделить истинный 2D-массив:

// allocate a 2D array and initialize it to null bytes
char (*structure)[20] = calloc(sizeof(*structure), 2);
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 20; j++) {
        printf("%02X ", structure[i][j]);
    }
    printf("\n");
}

Вывод:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
1 голос
/ 07 апреля 2019

Когда вы выделяете память, данные внутри памяти не определены.функция malloc просто дает вам память.если вы хотите, чтобы память была инициализирована на 0, вы всегда можете использовать стандартную функцию calloc .Если вы хотите инициализировать его после выделения, вы всегда можете использовать функцию memset .в вашем случае

memset(structure, 0,  (sizeof *structure) * 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...