gpt4 book ai didi

c - 如何修复 C 中结构内参差不齐的矩阵上不稳定的 free() 调用

转载 作者:太空宇宙 更新时间:2023-11-04 00:02:46 25 4
gpt4 key购买 nike

我正在创建一个尺寸为 n * m 的 map ,它应该从文件输入中获取。 map 的每个位置对于距离计算都很重要。在整个执行周期中,我经历了 4 次 malloc() 调用,但是我无法将它们与 4 次 free() 调用相匹配,否则执行可能会完成也可能不会完成,我不明白为什么。

这是主要调用:

int main()
{
map_t newMap;
newMap = map_create(30, 30);

//there's some test calls that I'm ommiting as they simply work and don't matter

map_destroy(newMap);
return 0;
}

据我理解和我想要的 map_t 是一个指向结构的指针,它在头文件中定义如下:

typedef struct map *map_t;

它的实现在相应的 .c 文件中用于封装。以下是案例的实现和重要功能:

struct map{
position_t **positions;
int lines, columns;
};

map_t map_create(int n, int m)
{
map_t newMap = malloc(sizeof(map_t));

newMap->lines = n;
newMap->columns = m;

newMap->positions = malloc(n * sizeof(position_t*));
int i;
int k;
for(i = 0; i < n; ++i)
{
newMap->positions[i] = malloc(m * sizeof(position_t));
for(k = 0; k < m; ++k)
{
newMap->positions[i][k] = position_create();
}
}

return newMap;
}

void map_destroy(map_t map_p)
{
int i, k;
int n = map_p->lines;
int m = map_p->columns;
for(i=0; i < n; ++i)
{
for(k=0; k < m; ++k)
{
position_destroy(map_p->positions[i][k]);
}
free(map_p->positions[i]);
}

free(map_p->positions);

free(map_p);
}

为了完整性,这里是位置结构的特定代码,它遵循与 map 结构相同的想法。

typedef struct position *position_t; //this is on the .h, the rest is on the .c file

struct position{
int has_treasure;
int times_visited;
};

position_t position_create()
{
position_t newPosition = malloc(sizeof *newPosition);
newPosition->has_treasure = YES;
newPosition->times_visited = 0;

return newPosition;
}

void position_destroy(position_t position_p)
{
free(position_p);
}

我已经确定是哪些免费电话导致了问题,但我不明白为什么。如果我评论这两行:

free(map_p->positions);
free(map_p);

一切正常。我见过不同的分配初始内存的方法,比如这个 - How do I correctly set up, access, and free a multidimensional array in C? - 但即使在那里找到了各种解决方案,我仍然遇到同样的不稳定问题。

这可能非常简单,我只是忽略了一些东西,现在已经进行了 5 天,我非常讨厌在这个烂摊子上借用任何人的时间,即使我必须实现我想要的不同解决方案至少明白哪里出了问题。

代码不会使用 -Wall -g -c 产生任何警告,如果我添加 -pedantic,我只会收到关于评论的投诉。

提前干杯

编辑:将 position_t newPosition = malloc(sizeof(position_t)); 更改为 position_t newPosition = malloc(sizeof *newPosition);行为还是一样

EDIT2:在 map_t malloc 上做了确切类型的更改,问题解决了,我一直认为问题出在 **positions

最佳答案

第一个 malloc(sizeof(map_t)); 只为指针分配空间。您需要使用 malloc(sizeof(*map_t));

但是你现在已经发现了,我明白了。

关于c - 如何修复 C 中结构内参差不齐的矩阵上不稳定的 free() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36489935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com