我正在使用一个功能完备的程序*,但我确实有一个关于分配内存的问题,因为我仍然不清楚某些事情。 (*完全功能意味着,它有我想要的结果,也可以是运气)。
typedef struct Field {
long index;
long x;
long y;
struct Cell *N;
struct Cell *S;
struct Cell *E;
struct Cell *W;
int count;
bool used;
} Field;
typedef struct Construct {
Field *fs1;
Field *fs2;
} Construct;
Field *fields;
long countFields = 1;
Construct *constructs;
long countStructs = 1;
有两个结构,一个叫Cell,一个叫Stone,Cell有坐标,索引,计数,bool和指向其他四个单元的指针。 Stone只有两个指向Cell的指针。两者都是相同名称的类型,只需附加Td。
所以我的问题是为它分配内存。 我对第一个malloc使用以下四个语句,稍后再添加更多元素。
这就是我学习它的方法,我想也可以替代" CellTd"使用" struct Cell"等等。 x只是谈论我的问题的一个因素。
我目前的问题是,我不确定这是否是正确的,因为我在增加x时会得到不同的结果。因此,当我使用它时,当因子x为1时,有时没有指向某些元素的严重指针。我使用x = 50然后一切正常,但这不应该是,它是如何工作的。 (只是说,当然,countStones和countCells都在创建数组中的元素数量......)
我在重新分配时遇到了什么问题?
答案 0 :(得分:1)
首先,如果要分配一系列内容,请使用calloc
。它检查乘法溢出,并用零初始化所有值。
其次,请确保您检查calloc
和realloc
来电是否成功。如果它们失败,它们将返回空指针。然后,您可以使用perror
来确定它们失败的原因,打印好的错误消息,然后退出。
对于您的逻辑,这是一个快速的gdb会话使用您的最小代码找到的内容(我只将第75行的i
类型更改为unsigned int
):
在segfault点:
(gdb) bt
#0 0x0000000000401112 in evaluateNeighbourNum (original=0x6034b0)
at cells.c:153
#1 0x0000000000401350 in evaluateNeighbourNum (original=0x612f20)
at cells.c:201
#2 0x0000000000401509 in calculate () at cells.c:229
#3 0x00000000004016c8 in main () at cells.c:250
(gdb) p *original
$14 = {
index = 2,
x = 1,
y = 0,
N = 0x411,
S = 0x6e20666f206d754e,
E = 0x72756f6268676965,
W = 0x2029302c31282073,
count = 925966394,
used = 48
}
如您所见,N
正在填充垃圾(0x411不是有效指针)。看看你是如何填充节点的。