C语言 正确使用 malloc/realloc 作为 typedef 结构



我有一个功能齐全的程序*,但我确实有一个关于分配内存的问题,因为我仍然不清楚。(*完全功能意味着,它有我想要的结果,也可以是运气(。

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具有坐标,索引,计数,布尔值和指向其他四个单元格的指针。 石头只有两个指向细胞的指针。两者都是同名的类型定义,只是附加了 Td。

所以我的问题是关于为它分配内存。 我将以下四个语句用于第一个 malloc 和稍后附加更多元素。

我就是这样学会的,我想也可以用"struct Cell"代替"CellTd"等等。 x只是谈论我的问题的一个因素。

我目前的问题是,我不确定这是否绝对正确,因为在增加 x 时我有不同的结果。因此,当我使用它时,当因子 x 为 1 时,有时没有指向某些元素的严肃指针。我正在使用 x=50,然后一切正常,但这不应该是,它是如何工作的。(只是说,可以肯定的是,countStones 和 countCells 都与数组中的元素数量一起创建......

我在重新分配方面做错了什么?

首先,如果要分配一个数组,请使用calloc。它检查乘法溢出,并很好地用零初始化所有值。

其次,确保你正在检查你的calloc,并realloc成功的呼声。如果失败,它们将返回空指针。然后,您可以使用perror来确定失败的原因,打印漂亮的错误消息,然后退出。

对于您的逻辑,以下是快速 gdb 会话使用最少代码找到的内容(我只将第 75 行的i类型更改为unsigned int(:

在段断层点:

(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不是有效的指针(。看看你是如何填充节点的。

最新更新