如何修复C中结构内部不规则矩阵上不稳定的free()调用

如何修复C中结构内部不规则矩阵上不稳定的free()调用,c,arrays,struct,C,Arrays,Struct,我正在创建一个n*m维的地图,应该从文件输入中获取。地图的每个位置对距离计算都很重要。在整个执行周期中,我经历了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 s

我正在创建一个n*m维的地图,应该从文件输入中获取。地图的每个位置对距离计算都很重要。在整个执行周期中,我经历了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;
}
据我所知,映射是指向结构的指针,它在头文件中定义如下:

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);
}
我已经确定是哪些免费电话导致了这个问题,我只是不明白为什么。如果我评论这两行:

free(map_p->positions);
free(map_p);
一切正常。我见过不同的分配初始内存的方法,比如这一种——但即使有各种各样的解决方案,我仍然会得到同样的不稳定性

这可能非常简单,我只是忽略了一些事情,已经做了5天了,因为我很不愿意在这个混乱中借用任何人的时间,即使我必须实施一个不同的解决方案,我想至少了解出了什么问题

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

提前欢呼

编辑:已更改
position\u t newPosition=malloc(sizeof(position\u t))
位置\u t newPosition=malloc(sizeof*newPosition)
行为还是一样

编辑2:地图上的确切变化类型是不是malloc,问题解决了,我一直认为问题在
**位置上
第一个
malloc(sizeof(地图))仅为指针分配空间。您需要使用
malloc(sizeof(*map_t))


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

为什么不使用2D数组呢?代码类似于position\t newPosition=malloc(sizeof(position\t))
将分配指针的大小,而不是您显然期望的结构……关于@Soren的注释,这就是为什么大多数有经验的程序员避免创建指针的类型别名。即使是编写代码并且应该知道例如,
map\u t
是指针的您,在区分类型及其指针时也会遇到困难,这应该会让您思考一下。需要时更好地使用显式指针声明。顺便提一下,关于如何始终为简单分配获得正确大小的快速提示:
position\t newPosition=malloc(sizeof*newPosition)
注意调用
malloc
@Soren时取消了对
newPosition
的引用完全正确,它现在工作没有任何问题。我真的感到惭愧,但更重要的是我感到感激,谢谢你们,我终于可以睡觉了
free(map_p->positions);
free(map_p);