【发布时间】:2021-10-23 23:36:53
【问题描述】:
在分配的内存块上调用 free 时收到错误消息。 根据我的代码,我得出以下 MWE:
(注意,那个free被注释掉了,如果被调用,就会报错。)
#include <stdio.h>
#include <malloc.h>
typedef struct foo1 {
double v1;
double v2;
double v3;
} foo1;
typedef struct foo2 {
foo1* myfoo1s;
int num_foo1;
} foo2;
void init_and_set_v1(foo2** myfoo2, int a_num){
*myfoo2 = malloc(sizeof(foo2));
(*myfoo2)->num_foo1 = a_num;
(*myfoo2)->myfoo1s = malloc( (*myfoo2)->num_foo1 * sizeof(foo2) );
for(int i = 0; i < (*myfoo2)->num_foo1; i ++){
(*myfoo2)->myfoo1s[i].v1 = 1.0;
}
//free( (*myfoo2) -> myfoo1s); //location 1
}
void set_v2_and_v3(foo2* myfoo2){
for(int i = 0; i < myfoo2->num_foo1; i ++){
myfoo2->myfoo1s[i].v2 = 2.0;
myfoo2->myfoo1s[i].v3 = 3.0;
}
//free(myfoo2->myfoo1s); //location 2
}
int main(){
foo2* myfoo2;
init_and_set_v1(&myfoo2, 10);
set_v2_and_v3(myfoo2);
printf("%d\n", myfoo2->num_foo1);
// ... do other things
//free(myfoo2->myfoo1s); //location 3
printf("done.");
return 0;
}
我有一个结构 foo2,它包含一个指向结构数组 foo1 的指针。我使用不同的函数分配内存和初始化变量,因为在我的用例中,我需要解析不同的数据文件。我不想有一个巨大的代码块。
但是,当我拨打免费电话时,我收到一个错误消息。我使用 GCC 7.5.0。 对于可能导致此问题的原因,我将不胜感激。
附:在我的原始程序中,错误取决于调用 free 的位置。在这个 MWE 中,它不是。
非常感谢。
【问题讨论】:
-
此行包含错误:
(*myfoo2)->myfoo1s = malloc( (*myfoo2)->num_foo1 * sizeof(foo2) );(即:应为sizeof(foo1))。 -
@LucaPolito 非常感谢。在我的原始代码中,类似的错误可能会导致错误。更改线路修复它。如果你快写答案,我会接受的。
-
别担心,你可以接受
dbush的回答。 -
@LucaPolito 我希望这可以为您提供一个教训,即意义命名很重要。
foo1可以很容易地与foo2混合使用。 -
@LucaPolito 好的,谢谢。