我正在研究结构如何在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上会引发错误?尽管两个函数定义都非常相似。
您的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乘以浮点数的大小。