0

我今天发现,当我尝试free指向已重新分配的指针时,程序崩溃并打印“分段错误”。

在此指针(数组)上调用Arealloc()以调整数组大小并将旧数组与另一个数组合并。

在程序中我必须free这样做,我怎样才能绕过这个问题而不必制作某种缓冲区数组,向其中添加 2 个其他数组然后释放它们?

  1. PARTICLE: 结构体
  2. newCount: 旧数组的大小总和 + 正在添加的数组

代码:

group1->particleList = 
         (PARTICLE *) realloc(group1->particleList, newCount * sizeof(PARTICLE));
4

3 回答 3

2

释放重新分配的指针应该没有问题。一个名为 valgrind 的程序可以为您提供一些关于代码中正在发生的事情的有价值的信息。

于 2012-05-08T20:39:30.867 回答
1

您是否包含“stdlib.h”?

铸造realloc和朋友的回归可以隐藏它没有原型的问题。较旧的编译器然后将其返回一个int,将其int转换为指针类型并完成损坏。

realloc正如其他人提到的那样,会返回的问题0不应该在缓冲时导致错误free,而是更早。

于 2012-05-08T20:39:28.273 回答
0

首先,确保将结果分配给realloc临时变量;如果请求失败,realloc将返回 NULL,并且您将失去对已分配内存的处理:

PARTICLE *tmp = realloc(group1->particleList, ...); // cast is unnecessary
if (tmp)
  group1->particlelist = tmp;
else
  /* handle realloc failure */

确保group1->particleList在调用之前不会意外覆盖(可能在合并代码中?)freerealloc即使在调用失败的情况下它被 NULL 覆盖,free 也应该能够处理 NULL 参数(基本上,这将是一个空操作)。

于 2012-05-08T20:37:18.763 回答