【发布时间】:2018-05-31 19:58:28
【问题描述】:
我确实对 C 中的内存重新分配有疑问,因为我认为这导致了一个问题,我已经有一个星期了,但没有找到它。 我是你有正方形的纸,你的人用绿色填充了几个正方形。所以现在,我正在尝试读取绿色方块的坐标(有人将它们放入标准输入),然后我想通过查看它们是否相邻来将它们链接在一起。 所以在 Cell 结构中,所有的 Cell 都有坐标、指向潜在邻居的指针和邻居计数器。还有一个名为 setNeighbours 的函数,它判断它们是否是邻居并将地址填充到每个对象中。 所以我的问题是关于重新分配方法,因为我知道这可能会将地址块移动到其他地方,因此,有时(可能 40% 的时间)我在打印结果时会得到错误的结果。
代码如下。 我知道重新分配行是原因,因为如果我删除它并在 malloc 行中放入足够的空间,以便以后不需要重新分配,那么一切正常。 我想有一个愚蠢的时刻,我要求一个以前更改过的旧地址,但我看不到它。有人看到了吗?
#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
【问题讨论】:
-
为什么不在
proofString()中使用sscanf("%d %d")? -
调用
setNeighbours()的循环应该在你读完所有坐标之后执行一次,而不是在读完每一行之后。 -
如果你这样做,所有的重新分配将首先完成,你不会有任何指向旧地址的悬空指针。
-
使用索引(数组的偏移量)而不是指针。
-
为什么要使用全局变量?养成的坏习惯