正确使用malloc / realloc for typedef struct

时间:2018-05-27 15:25:37

标签: c struct typedef realloc

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

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都在创建数组中的元素数量......)

我在重新分配时遇到了什么问题?

1 个答案:

答案 0 :(得分:1)

首先,如果要分配一系列内容,请使用calloc。它检查乘法溢出,并用零初始化所有值。

其次,请确保您检查callocrealloc来电是否成功。如果它们失败,它们将返回空指针。然后,您可以使用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不是有效指针)。看看你是如何填充节点的。