Malloc为单个结构而不是结构数组创建空间

问题描述

|| 我整天都在为解决这个问题而努力,我将非常感谢任何能够提供帮助的人。 这很重要-我正在尝试使用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()
会自己进行分配吗?