Как вставить экземпляр структуры в массив типа структуры в c?

Что я хочу делать?

Я хочу создать массив из struct типов и вставить в него struct экземпляров.

{"struct Matrix matrix1", "struct Matrix matrix2"}

Что я сделал до сих пор?

Я создал функцию create_struct(), которая принимает необходимые параметры для struct и возвращает указатель struct.

typedef struct
{
    size_t rows, columns;
    int *table;
} mat;

mat *create_struct(int x, int y)
{
    mat *data = (mat *)malloc(sizeof(*data));
    data->table = malloc(sizeof(int[(x * y)]));
    data->columns = y;
    data->rows = x;
    return data;
}

Затем я создал указатель на объект в этом случае struct и попытался вставить struct экземпляры с помощью цикла for и функции create_struct(). Но при этом программа вылетает.

int main()
{
    size_t dimensions[2][2] = {{3, 3}, {3, 2}};

    mat *matrix;

    for (size_t i = 0; i < 2; i++)
    {
        matrix[i] = create_struct(dimensions[i][0], dimensions[i][1]);
    }

    return 0;
}

Я думаю, что основная проблема заключается в этой линии.

matrix[i] = create_struct(dimensions[i][0], dimensions[i][1]);

Прежде всего, это приведет к ошибке компиляции a value of type "mat *" cannot be assigned to an entity of type "mat"

Итак, чтобы решить эту проблему, я сделал что-то вроде этого. Что я считаю совершенно неопределенным. Я могу ошибаться.

matrix[i] = *create_struct(dimensions[i][0], dimensions[i][1]);

Что я ожидаю от ответов

В центре внимания должно быть следующее:

  • Можно ли сделать что-то вроде того, что делаю я?
  • Есть ли лучший способ или процедура для вставки экземпляров struct в массив типов struct?
  • Предоставьте информацию, если вы считаете, что мне не хватает каких-либо концептуальных знаний.
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Конечно. Просто выделите память для указателей на mat вместо разыменования неинициализированного указателя matrix. В качестве альтернативы используйте массив указателей на mat.

int main()
{
    size_t dimensions[2][2] = {{3, 3}, {3, 2}};

    mat** matrix = calloc(2, sizeof *matrix);
    // OR
    // mat* matrix[2];

    for (size_t i = 0; i < 2; i++)
    {
        matrix[i] = create_struct(dimensions[i][0], dimensions[i][1]);
    }

    return 0;
}

Вот весь код, после первого ввода для матрицы [1] или, можно сказать, матрицы 2, код дает сбой. Зачем?

Harshit Singh 05.05.2022 22:00

Пожалуйста, попробуйте код в вашей системе.

Harshit Singh 05.05.2022 22:01

@HarshitSingh, все работает. См. godbolt.org/z/zvG1d8ec8. Выражение «ИЛИ» означает, что используется любой из обходов строки. я обновлю ответ

tstanisl 05.05.2022 22:16

Бро, я не просто нагло скопировал твое решение, я сначала прочитал его, а затем применил.

Harshit Singh 05.05.2022 22:49

Я сказал проверить полную версию кода, который вы тестировали, с неполной версией, проверьте этот godbolt.org/z/5TGqavzf6.

Harshit Singh 05.05.2022 23:20

@HarshitSingh, элементы matrix неправильно разыменованы. Используйте printf("%d %d\n", matrix[i]->columns, matrix[i]->rows);. Эта часть вашего кода отсутствовала в вопросе. Попробуйте godbolt.org/z/YMrzhx3nj

tstanisl 05.05.2022 23:42

какая разница между 2.

Harshit Singh 06.05.2022 00:00

@HarshitSingh, (*matrix)[i].columns для i=1 это то же самое, что matrix[0][1].columns. Однако этого объекта не существует, допустим только matrix[0][0]. А matrix[i][0].column это то же самое, что matrix[i]->columns

tstanisl 06.05.2022 09:30

Давайте продолжить обсуждение в чате.

Harshit Singh 06.05.2022 17:49

Другие вопросы по теме