Почему доступ к элементам структуры внутри функции вызывает mallo c (): поврежденный верхний размер на языке C? - PullRequest
0 голосов
/ 11 апреля 2020

Я изучаю, как структуры работают на языке 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 возникла ошибка? Несмотря на то, что оба определения функций очень похожи.

1 Ответ

0 голосов
/ 11 апреля 2020

Ваш mallo c недействителен.

    fARRAY R = {(float*)malloc(sizeof(S.len)), S.len};

Вы mallo c массив с плавающей точкой, вы должны mallo c вот так:

    fARRAY R = {(float*)malloc(sizeof(float) * S.len), S.len};

Вы Я хочу, чтобы в вашем массиве было достаточно места для S.len, чтобы размер S.len умножился на float.

...