我一整天都在为这个问题苦苦思索,我将非常感谢任何可以提供帮助的人。
事情是这样的 - 我正在尝试使用 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
会收到该值,该值会反射(reflect)在调试器中。我的另外 3 个槽去哪儿了? tempVertices 似乎指向单个 CGPoint 而不是数组。我想要数组。
关于我做错了什么有什么想法吗?我知道还有其他方法可以使用 C++ 或其他对象来解决此问题,但如果可能的话我想坚持使用 C。
提前致谢!
更新:
为了回答 zpasternack,setVertices:
是一个自定义编写的 setter 。我不知道它如何/是否知道传入数组有多大。我试图更好地理解直接的 C 内容,因此非常感谢有关将动态 C 数组作为参数传递的正确方法的见解/解释。 setter 如下所示:
- (void) setVertices:(CGPoint*) val {
_vertices = val; //_vertices is a member variable of the type CGPoint*
//...calculate a centroid, other stuff...
}
如果需要,我可以将 CGPoints 包装在 NSValue 对象中并使用 NSArray 代替,但我确实想知道在普通 ol' C 中执行此操作的正确方法。
感谢所有发表评论的人 - 你们太棒了:)
最佳答案
在您的 32 位机器上,您将得到您所期望的结果。 sizeof(tempVertices) 是指针的大小,而 sizeof(*tempVerices) 给出 CGPint 的大小(可能是两个整数)。您无法使用 sizeof() 获取已分配数组的大小。该值仅在运行时才知道,并且 sizeof() 是一个编译时运算符。
关于iphone - Malloc() 为单个结构创建空间,而不是为结构数组创建空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195045/