【发布时间】:2012-04-04 09:02:17
【问题描述】:
我在一个结构中有一个 CGPoints 的 c 数组。添加另一个 CGPoint 时,我需要替换此数组。我发誓我做对了,它似乎工作了好几次,但最终我会得到一个EXC_BAD_ACCESS。我错过了什么?
这是结构,我已将其截断以删除许多不相关的项目。
typedef struct{
CGPoint **focalPoints;
NSUInteger focalPointCount;
CGRect boundingRect;
}FocalPoints;
我是这样初始化它的:
CGPoint *fPoints = (CGPoint *)malloc(sizeof(CGPoint));
FocalPoints focalInfo = {&fPoints, 0, rect};
请注意,focalInfo 是通过引用传递给另一个函数的,例如:anotherFunction(&focalInfo)。
下面是用新数组替换 Points 数组的函数:
void AddFocalPoint (CGPoint focalPoint, FocalPoints *focal){
if (focalPoint.x == CGFLOAT_MAX) return;
if (!CGRectContainsPoint(focal->boundingRect, focalPoint)) return;
int origCount = focal->focalPointCount;
int newCount = origCount + 1;
CGPoint *newPoints = (CGPoint *) malloc((newCount) * sizeof(CGPoint));
for (int i = 0; i < newCount; i++)
newPoints[i] = (i < origCount) ? *focal->focalPoints[i] : focalPoint; //error occurs here
free(*focal->focalPoints);
*focal->focalPoints = newPoints;
focal->focalPointCount = newCount;
}
上述代码第 8 行出现 EXC_BAD_ACCESS 错误:newPoints[i] = (i < origCount) ? *focal->focalPoints[i] : focalPoint;。那我到底做错了什么?
【问题讨论】:
-
我不太确定,但我认为 newPoints[i] 是一个 CGPoint,而 *focal->focalPoints[i] 是一个 CGPoint 指针...
-
您是否考虑过使用链表甚至
NSMutableArray/NSValue,这样您就不会在每次想要添加点时都分配、复制和释放整个东西?跨度> -
fPoints 的原始 malloc 在技术上没有被使用。但是我分配了空间,因为 AddFocalPoint 函数会对其调用 free ,并且我不想释放尚未 malloc 的空间。
&fPoints添加一个指向 fPoints 的额外指针。我这样做是因为我相信这是替换 c-arrays 的唯一方法。 -
"
fPoints的原始malloc()没有在技术上使用":你不需要分配它,那么——只要你将它初始化为NULL,你'会好的。free(NULL)是一个完全安全的无操作。 -
大声笑...哦,是的,我忘记了。谢谢,自从我弄乱了c指针以来已经有一点了。
标签: objective-c c arrays reference