Я изучаю, как структуры работают на языке C, и как их можно передавать и использовать внутри функции. Я не до конца понимаю поведение объектов структур и то, как их инициализировать с помощью выделения памяти с помощью функции mallo c.
Я определил структуру с именем fARRAY и другие параметры следующим образом:
float m = 0.98;
float K = 360.0;
typedef structu {
float* array;
size_t len;
} fARRAY;
// functions prototypes
fARRAY operation1(float, float, fARRAY);
fARRAY operation2(fARRAY);
Затем я хочу использовать эту структуру для хранения массива данных типа float и его длины в типе данных size_t. Затем я также хочу передать его в функции с именами operation1 и operation2 следующим образом:
// Function definition. S is the structure, which I will define latter
fARRAY operation1(float m, float K, fARRAY S) {
fARRAY R = {(float*)malloc(sizeof(S.len)), S.len};
for(int i = 0; i < R.len; i++) {
R.array[i] = m * (S.array[i] / (K + S.array[i]));
}
return R;
}
fARRAY operation2(fARRAY A) {
printf("Here inside operation2\n");
printf("Length of A array: %d", A.len);
fARRAY iA = {(float*)malloc(sizeof(A.len)), A.len};
for(int i = 0; i < iA.len; i++) {
iA.array[i] = 1 / A.array[i];
}
return iA;
}
После определения функций я написал основную функцию следующим образом:
int main() {
float a[] = {50, 100, 150, 200, 400};
size_t len = sizeof(a) / sizeof(a[0]);
fARRAY S = {a, len};
fARRAY MIUS = operation1(m, K, S);
printf("Print MIUS array\n");
for(int i = 0; i < MIUS.len; i++) {
printf("%f ", MIUS.array[i]);
}
printf("\n");
fARRAY iS = operation2(S);
printf("Printing iS array\n");
return 0;
}
Код был успешно скомпилирован с GNU C Compiler версии 8. Я не компилировал его с дополнительными флагами. И следующее, вывод ошибки, который я получил.
Печать массива MIUS
0,119512 0,213043 0,288235 0,350000 0,515790
Здесь внутри операции2
mallo c (): размер поврежденного верха
Прервано (ядро сброшено)
Анализ этой ситуации. Ошибка возникает после того, как операция2 печатает на экране фразу «Здесь, внутри операции 2», это означает, что ошибка может возникнуть из-за доступа к члену fARRAY iA len. Я думаю, что это может вызвать дамп ядра, но в функции mallo c также есть поврежденная ошибка верхнего размера. У меня вопрос: почему operation1 работала довольно хорошо, а на operation2 возникла ошибка? Несмотря на то, что оба определения функций очень похожи.