Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 传递CGPoint*而不是CGPoint[]无效?_Ios_Arrays_Opengl Es_Cocos2d Iphone - Fatal编程技术网

Ios 传递CGPoint*而不是CGPoint[]无效?

Ios 传递CGPoint*而不是CGPoint[]无效?,ios,arrays,opengl-es,cocos2d-iphone,Ios,Arrays,Opengl Es,Cocos2d Iphone,我试图用一个函数来简化我的代码,该函数生成一个CGPoints数组,并返回指向该数组中第一个元素的指针 CGPoint* getVerticesFromRect(const CGRect rect) { CGPoint vertexArray[] = { ccp(rect.origin.x, rect.origin.y), ccp(rect.origin.x + rect.size.width, rect.origin.y), ccp(rect

我试图用一个函数来简化我的代码,该函数生成一个CGPoints数组,并返回指向该数组中第一个元素的指针

CGPoint* getVerticesFromRect(const CGRect rect) {
    CGPoint vertexArray[] = 
    {  ccp(rect.origin.x, rect.origin.y),
        ccp(rect.origin.x + rect.size.width, rect.origin.y),
        ccp(rect.origin.x + rect.size.width, rect.origin.y - rect.size.height),
        ccp(rect.origin.x, rect.origin.y - rect.size.height) };
    CGPoint *vertices = &vertexArray[0];
    return vertices;
}
这是正确的,但当我尝试在以下情况下使用此CGPoint*时,问题出现了:

void ccDrawPoly( const CGPoint *poli, NSUInteger numberOfPoints, BOOL closePolygon )
像这样:

void ccDrawRect( const CGRect rect ) {
    CGPoint *vertices = getVerticesFromRect(rect);
    // Makes an array from the pointed CGPoints
    CGPoint vertexArray[] = {vertices[0], vertices[1], vertices[2], vertices[3]};
    ccDrawPoly(vertexArray, 4, YES); // This works
    ccDrawPoly(vertices, 4, YES); // This doesn't
}
我发现,尝试读取
ccDrawRect
中的
*顶点
变量会给出正确的值,但在将其传递到
ccDrawPoly
时,另一侧会得到垃圾值。这背后的原因是什么?据我所知,CGPoint*poli和CGPoint poli[]应该是相同的。问题是由
常量引起的吗

编辑

按照建议,我更改了我的函数,现在传递指针可以正常工作了。问题是返回一个指向局部变量的指针,该变量不会停留太久。相反,我使用了malloc,一旦不再需要调用函数,我就会释放它中的内存

CGPoint* getVerticesFromRect(const CGRect rect) {
    CGPoint *vertices = (CGPoint*) malloc(sizeof(CGPoint) * 4);
    assert(vertices);

    vertices[0] = ccp(rect.origin.x, rect.origin.y);
    vertices[1] = ccp(rect.origin.x + rect.size.width, rect.origin.y);
    vertices[2] = ccp(rect.origin.x + rect.size.width, rect.origin.y - rect.size.height);
    vertices[3] = ccp(rect.origin.x, rect.origin.y - rect.size.height);

    return vertices;
}

void ccDrawRect( const CGRect rect ) {
    CGPoint *vertices = getVerticesFromRect(rect);
    ccDrawPoly(&vertices[0], 4, YES);
    free(vertices);
    vertices = NULL;
}

您正在使用超出其范围的局部变量

而不是像您这样在堆栈上分配数组:

CGPoint vertexArray[] = ...
您需要使用
malloc
函数并创建一个动态分配的数组。当然,别忘了
免费


(它真的是C吗?

在这种情况下,它应该是
malloc
free
。C,不是C++:)LOL,太长了,我想知道内存管理会在哪里出现。谢谢但是这如何解释为什么数组工作而指针不工作呢?纯粹是运气。当你做你所做的事情时,你会得到未定义的行为。它可以工作,也可以崩溃,尽管如此。