为什么在函数内部访问结构成员会导致malloc():C语言中的最大大小损坏?

问题描述 投票:0回答:1

我正在研究结构如何在C语言中工作,以及如何在函数内部传递和使用它们。我不完全了解结构对象的行为以及如何使用带有malloc函数的内存分配初始化它们的方式。

我定义了一个名为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编译器版本8成功编译。我未使用其他标志对其进行编译。以下是我获得的错误输出。

打印MIUS数组

0.119512 0.213043 0.288235 0.350000 0.515790

在此进行内部操作2

malloc():损坏的最大大小

中止(核心已弃用)

分析这种情况。在operation2打印以筛选短语“ Here inside operation 2”之后出现错误,这意味着由于访问fARRAY iA成员len可能会出现错误。我认为这可能会导致核心转储,但malloc函数中也存在损坏的最大大小错误。我的问题是:为什么operation1可以正常运行,而在operation2上会引发错误?尽管两个函数定义都非常相似。

c struct malloc core dump
1个回答
0
投票

您的malloc无效。

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

您在其中分配了一个float数组,您应该像这样进行malloc:

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

您想要在数组中为S.len浮点数留出足够的空间,以使S.len乘以浮点数的大小。

© www.soinside.com 2019 - 2024. All rights reserved.