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

Why accessing structure members inside a function causes malloc(): corrupted top size in C language?

我正在研究结构在 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 成功编译。我没有使用其他标志编译它。下面是我得到的错误输出。

Print MIUS array

0.119512 0.213043 0.288235 0.350000 0.515790

Here inside operation2

malloc(): corrupted top size

Aborted (core dumped)

这种情况分析。 在 operation2 打印到屏幕短语“Here inside operation 2”之后出现错误,这意味着错误可能是由于访问 fARRAY iA 成员 len 而引起的。我认为这可能会导致核心转储,但 malloc 函数中也存在损坏的最大尺寸错误。我的问题是:为什么 operation1 工作得很好,而 operation2 却引发了错误?尽管这两个函数定义非常相似。

您的 malloc 无效。

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

你 malloc 一个 float 数组,你应该像那样 malloc :

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

您希望数组中的 S.len 浮点数足够 space,因此 S.len 倍于浮点数的大小。