我正在研究结构在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 operation2n");
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 arrayn");
for(int i = 0; i < MIUS.len; i++) {
printf("%f ", MIUS.array[i]);
}
printf("n");
fARRAY iS = operation2(S);
printf("Printing iS arrayn");
return 0;
}
该代码已使用GNU C编译器第8版成功编译。我没有用其他标志编译它。下面是我得到的错误输出。
打印MIUS阵列
0.119512 0.213043 0.288235 0.350000 0.515790
此处为内部操作2
malloc((:损坏的最大尺寸
中止(堆芯转储(
对此情况的分析。错误出现在操作2打印以筛选短语";这里的内部操作2〃;,这意味着访问fARRAY iA成员len可能会出现错误。我认为这可能会导致核心转储,但malloc函数中也存在损坏的最大大小错误。我的问题是:为什么操作1工作得很好,而在操作2时却出现了错误?尽管这两个函数定义非常相似。
您的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是浮点大小的倍。