gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:48:10 26 4
gpt4 key购买 nike

我确实有一个关于 C 中内存重新分配的问题,因为我认为这导致了一个问题,我已经有一个星期了,但没有找到它。我是你有方格纸,你的某人用绿色填充了几个方格。所以现在,我试图读取绿色方 block 的坐标(有人将它们放入标准输入中),然后我想通过查看它们是否相邻来将它们链接在一起。因此,在 Cell 结构中,所有 Cell 都有坐标、指向潜在邻居的指针和邻居计数器。还有一个名为 setNeighbours 的函数,它可以确定它们是否是邻居并将地址填充到每个对象中。所以我的问题是关于重新分配方法,因为我知道这可能会将地址 block 移动到其他地方,因此,有时(也许 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

最佳答案

So my problem is about the reallocation method, because I know this is potentially moving the address block to somewhere else and in reason for that, sometimes (maybe 40% of the times) I am getting wrong results when printing out the results.

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

只有几个可行的解决方案:

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

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

    • 特殊情况:每当数据重新分配到不同的地址时,重新计算所有指针。或者,
  • 避免重新分配。您可以通过预先为所有内容分配足够的空间(如果您拥有或可以获得所需数量的合理上限,这是一个非常好的选择),或者独立于其他结构分配每个结构。

关于使用 C 中的 realloc 更改内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50631899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com