Я хочу создать массив из 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
?Конечно. Просто выделите память для указателей на 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;
}
Пожалуйста, попробуйте код в вашей системе.
@HarshitSingh, все работает. См. godbolt.org/z/zvG1d8ec8. Выражение «ИЛИ» означает, что используется любой из обходов строки. я обновлю ответ
Бро, я не просто нагло скопировал твое решение, я сначала прочитал его, а затем применил.
Я сказал проверить полную версию кода, который вы тестировали, с неполной версией, проверьте этот godbolt.org/z/5TGqavzf6.
@HarshitSingh, элементы matrix
неправильно разыменованы. Используйте printf("%d %d\n", matrix[i]->columns, matrix[i]->rows);
. Эта часть вашего кода отсутствовала в вопросе. Попробуйте godbolt.org/z/YMrzhx3nj
какая разница между 2.
@HarshitSingh, (*matrix)[i].columns
для i=1
это то же самое, что matrix[0][1].columns
. Однако этого объекта не существует, допустим только matrix[0][0]
. А matrix[i][0].column
это то же самое, что matrix[i]->columns
Давайте продолжить обсуждение в чате.
Вот весь код, после первого ввода для матрицы [1] или, можно сказать, матрицы 2, код дает сбой. Зачем?