C: ОШИБКА после неправильного обращения и передачи в массив двумерного символа

Я не понимаю, что не так с кодом ниже. Он должен распределять массив двумерных символов [5][30] (называемый LENGTH), передавать его функции и заполнять строкой. Это прекрасно работает в функции; Я могу напечатать его оттуда без проблем. Но я не могу напечатать даже первый из функции main() (приложение вылетает, если я пытаюсь). Может кто-нибудь объяснить, что я делаю не так?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LENGTH 5 
void fillArray(char array[][LENGTH]) {
    for (int i = 0; i < 5; i++) {
        strcpy(array[i],"Hi World");
    }
    for (int i = 0; i < 5; i++) {
        printf("%s\n",array[i]);
    }
}

int main() {
    char** array = (char**)malloc(5*sizeof(char*));
    for (int i = 0; i < 5; i++) {
        array[i] = (char*)malloc(LENGTH);
    }
    fillArray(array);
    printf("%s",array[0]);
    getchar();
    return 0;
}

2 ответа

Решение

От main() функция, которую вы передаете двойной указатель array и ловить с 2D-массивом array[][LENGTH] что неверно, просто сказать, что двойной указатель не похож на двумерный массив и наоборот.

для вашей задачи в fillArray() использование array of char pointer в качестве аргумента, сколько? LENGTH,

void fillArray(char *array[LENGTH]) { /* this is okay */
        for (int i = 0; i < 5; i++) {
                strcpy(array[i],"Hi World");/*now in `array[i]` you can store any no of char. */
        }
        for (int i = 0; i < 5; i++) {
                printf("%s\n",array[i]);
        }
}

Также кастинг malloc() не требуется, и как только работа выполнена, не забудьте освободить динамически выделенную память, вызвав free() для каждого.

Основная проблема в том, что ваша функция ожидает двухмерный массив, но это не то, что вы передаете функции.

В main Вы выделяете одномерный массив указателей. Затем для каждого из этих указателей вы выделяете одномерный массив символов. Это не двумерный массив.

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

Так что вместо:

char** array = (char**)malloc(5*sizeof(char*));
for (int i = 0; i < 5; i++) {
    array[i] = (char*)malloc(LENGTH);
}

попробуй это:

char (*array)[LENGTH] = malloc(5*LENGTH*sizeof(char*));

чтобы получить правильно malloc'ed 2D массив.

КСТАТИ:

Я думаю, у вас есть ошибка здесь

#define LENGTH 5
               ^
               I guess you want 30 instead of 5
Другие вопросы по тегам