使用C中的realloc更改了内存地址

时间:2018-05-31 19:58:29

标签: c realloc

我确实有一个关于在C中重新分配内存的问题,因为我认为这导致了一个问题,我已经有一个星期了,但没有找到它。 我是方形纸,你的人用绿色填充了几个正方形。所以现在,我正在尝试读取绿色方块的坐标(有人把它们放入stdin)然后我想通过查看它们是否在一起相连来将它们连接在一起。 所以在Cell结构中,所有Cell都有坐标,指向潜在邻居的指针和邻居的计数器。并且有一个名为setNeighbours的函数可以确定它们是否是邻居并将地址填充到每个对象中。 所以我的问题是关于重新分配方法,因为我知道这可能会将地址块移动到其他地方并且有理由,有时(可能是40%的时间)我在打印结果时得到错误的结果。

代码如下。 我知道重新分配行是原因,因为如果我删除它并且只是在malloc行中放入足够的空间以便以后不需要realloc,那么一切正常。 我想有一个愚蠢的时刻,我正在呼唤一个之前发生变化的旧地址,但我看不到它。有人看到了吗?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>

typedef struct Square {
    long index;
    long x;
    long y;
    struct Square *Above;
    struct Square *Below;
    struct Square *Right;
    struct Square *Left;
    int count;
} SquareType;

SquareType *cellArr;
long countSquares = 0;

示例输入:

1 3
2 3
3 3
2 2
2 1
3 2

1 个答案:

答案 0 :(得分:1)

  

所以我的问题是重新分配方法,因为我知道这是   可能会将地址块移动到其他地方并且有理由   为此,有时(可能有40%的时间)我错了   打印出结果时的结果。

实际上,realloc()并不总是将重新分配的块放在与原始块相同的地址上。如果重新分配包含结构的空间,则必须假设在重新分配之前获得的那些结构的任何指针都不再有效。你的代码似乎没有做出这样的假设。

只有少数可行的解决方案:

  • 不要依赖于指向已分配空间的指针,而不是您维护到空间开头的主要空间。实现这一目标的一种方法是通过索引而不是直接指向它们来识别邻居。或者,

  • 仅在读取所有数据后设置指针,以便确保已执行所有需要的重新分配。或者,

    • 特殊情况:每当数据重新分配到不同的地址时,重新计算所有指针。或者,
  • 避免重新分配。你可以通过为所有事先分配足够的空间来做到这一点(如果你已经或者至少可以获得你需要的数量的合理上限,那么这是一个非常好的选择),或者通过独立于其他结构分配每个结构。 / p>