为什么访问函数内部的结构成员会导致 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 倍于浮点数的大小。
我正在研究结构在 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 倍于浮点数的大小。