问题描述
||
我整天都在为解决这个问题而努力,我将非常感谢任何能够提供帮助的人。
这很重要-我正在尝试使用malloc()创建动态C数组。该数组将保存CGPoint结构,在构建数组后立即开始构建和分配该结构。这是代码:
CGPoint* tempVertices = malloc(sizeof(CGPoint) * 4); //defining a collision frame
tempVertices[0] = CGPointMake(37,46);
tempVertices[1] = CGPointMake(69,40);
tempVertices[2] = CGPointMake(48,6);
tempVertices[3] = CGPointMake(17,10);
//Then I pass the pointer to my array off to a setter...
[self setVertices: tempVertices];
但是,当创建tempVertices时,似乎只为一个CGPoint腾出了空间:
int test1 = sizeof(CGPoint); // 8
int test2 = sizeof(tempVertices); // 4
int test3 = sizeof(*tempVertices); // 8
当逐步使用XCode调试器时,它显示tempVertices
是指向CGPoint
的指针。当我设置tempVertices[0]
时,tempVertices
指向的CGPoint
会收到该值,这反映在调试器中。我的其他三个插槽又去了哪里? tempVertices
似乎指向的是sin3ѭ而不是数组。我想要数组。
关于我在做什么错的任何想法吗?我知道还有其他方法可以使用C ++或其他对象来解决此问题,但我想尽可能地坚持使用C。
提前致谢!
更新:
要回答zpasternack,“ 9”是一个自定义的书面设置器。而且我不知道/是否知道传入数组的大小。我试图更好地理解C语言,因此对于将动态C数组作为参数传递的正确方法的见解/解释受到高度赞赏。这是二传手的样子:
- (void) setVertices:(CGPoint*) val {
_vertices = val; //_vertices is a member variable of the type CGPoint*
//...calculate a centroid,other stuff...
}
如果需要,我可以将CGPoints包装在NSValue对象中,而改用NSArray,但是我当然想知道在普通C语言中正确的方法。
感谢所有发表评论的人-你们很棒:)
解决方法
好的,在您完成编辑后,我想我知道发生了什么。就像您编写的那样,该代码应该可以正常工作。 Xcode不会显示任何CGPoint的值,因为Xcode不知道它是一个数组,而只是指向单个CGPoint的指针。但它在那里。呼叫
setVertices:
后立即设置一个断点。在gdb提示符下,打印其中一些值。
(gdb) print _vertices[1]
$2 = {
x = 69,y = 40
}
(gdb) print _vertices[3]
$3 = {
x = 17,y = 10
}
对不对?
这并不是说这里没有问题。一方面,ѭ9正在泄漏该内存。您正在为tempVertices
分配内存,握住该指针,但没有在任何地方释放它。下次致电setVertices:
时,您将发生泄漏。
更大的问题是,除了为其分配内存的代码之外,没有人知道该数组中有多少个CGPoint。会永远是4 CG点吗?如果有人访问ѭ16或ѭ17会发生什么?不好的事情,如果您没有为他们分配那么多的空间。
是否有一个纯C数组的要求?就像,这些要点将传递给OpenGL或cocos2d之类的东西?如果没有,您可以考虑使用某种数组类。因为这些不是您要存储的NSObject派生的对象,所以您不能使用NSArray。如果您不介意拖入一堆C ++,可以使用std::vector
。我可能不会这样做。
如果您打算坚持使用C数组,则可能应该做一些工作以尝试使该接口更不易出错。就像我之前提到的,您需要跟踪数组的大小。也许您可以在setVertices中添加一个参数:代表数组所包含的CGPoints的数量。然后,访问_vertices
的代码的其他部分可以检查以确保它们没有离开数组的末尾。而且,就像我之前提到的,请确保在重新分配指针之前释放该内存。
纠缠于指针充满危险。小心地踩着,那里有龙。
, 在您的32位计算机上,您将获得预期的结果。 sizeof(tempVertices)是指针的大小,而sizeof(* tempVerices)为您提供CGPint的大小(可能是两个整数)。您无法使用sizeof()获得分配的数组的大小。该值仅在run-rime处已知,并且sizeof()是编译时运算符。
, malloc正在为4个GCPoint结构分配足够的空间,并返回指向已分配空间的指针。
第一个是tempVertices +0。它是tempVertices [0]。
第二个是tempVertices +1。它是tempVertices [1]。
第三个是tempVertices +2。它是tempVertices [2]。
第四个是tempVertices +3。它是tempVertices [3]。
, 我不会使用ѭ20来确定运行时分配的数组的大小。
您实际上在分配新的CGPoint
对象到数组中遇到困难吗? CGPointMake()
会自己进行分配吗?