Ошибка сегментации - объявить и инициализировать массив в C

Я очень новичок в C., исходя из миров Python, Java и С#. Это может быть глупый вопрос, но я получаю ошибку сегментации:

// struct for storing matrices
typedef struct { int m; int n; float* elts;
} Matrix;

и в моем основном методе:

Matrix A; A.n = 3; A.m = 3; memcpy( A.elts, (float[]) {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f}, 9 * sizeof(float)); // seg fault because of this memcpy.

Я также попытался без f, тот же вопрос. Можете ли вы помочь

3 ответа

Вы должны выделить память для A.elts для указания. Вы можете сделать это с помощью malloc. То, что вы делаете, заключается в том, чтобы справиться с постоянным массивом, который вы указали, в любой адрес, elts должен указывать (он неинициализирован).

Вы также можете указать A.elts в постоянный массив следующим образом:

float *myFloats = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
A.elts = myFloats;


В C массивы и указатели связаны, но они не совпадают. Недостаточно объявить указатель, чтобы сделать его массивом: вам нужно установить этот указатель на значение, указывающее на блок памяти достаточного размера.

Чтобы ваш пример работал, добавьте

A.elts = malloc(sizeof(float) * 9);

перед вызовом memcpy. В противном случае указатель elts остается неинициализированным, поэтому запись в память, elts этим указателем, является неопределенным поведением. Обратите внимание, что вам нужно будет позвонить free(A.elts) когда вы закончите с массивом.

Другой альтернативой будет объявление elts как массив фиксированного размера, а не как указатель:

float elts[9];

Однако это не позволило бы изменить размер массива.


Вы не выделили какую-либо память для хранения значений поплавка. До memcpy вам нужно что-то вроде:

A.elts = malloc (9 * sizeof (float));

licensed under cc by-sa 3.0 with attribution.