目标C:传递给另一个方法时,数组的大小会发生变化

时间:2010-01-02 19:41:08

标签: iphone objective-c cocoa-touch

我遇到了一个小问题。当从Objective-c函数传递给c函数时,我有一个数组并且它的大小发生了变化。

void test(game_touch *tempTouches)
{
    printf("sizeof(array): %d", sizeof(tempTouches) );
}

-(void)touchesEnded: (NSSet *)touches withEvent: (UIEvent *)event
{
    game_touch tempTouches[ [touches count] ];
    int i = 0;

    for (UITouch *touch in touches)
    {
        tempTouches[i].tapCount = [touch tapCount];

        tempTouches[i].touchLocation[0] = (GLfloat)[touch locationInView: self].x;
        tempTouches[i].touchLocation[1] = (GLfloat)[touch locationInView: self].y;

        i++;
    }

    printf("sizeof(array): %d", sizeof(tempTouches) );

    test(tempTouches);
}

控制台日志是:

[touchesEnded] sizeof(array): 12
[test] sizeof(array): 4

为什么两种方法的大小不同?

在[test]方法中,返回的大小始终为4,不依赖于数组的原始大小。

感谢。

3 个答案:

答案 0 :(得分:6)

在C数组中,当它们作为参数传递时会衰减为指针。 sizeof运算符无法知道传递给void test(game_touch *tempTouches)的数组的大小,从它的角度来看它只是一个大小为4的指针。

使用此语法int arr[20]声明数组时,大小在编译时是已知的,因此sizeof可以返回它的真实大小。

答案 1 :(得分:5)

尽管C中的数组和指针有许多相似之处,但这是其中一种情况,如果您不熟悉它们的工作方式,则可能会造成混淆。这句话:

game_touch tempTouches[ [touches count] ];

定义一个数组,因此sizeof(tempTouches)返回该数组的大小。但是,当数组作为参数传递给函数时,它们作为指针传递给它们占用的内存空间。所以:

sizeof(tempTouches)
函数中的

返回指针的大小,这不是数组的大小。

答案 2 :(得分:1)

test中,tempTouches是指向数组第一个元素的指针。

您还应该将数组的元素数传递给函数。