我遇到了一个小问题。当从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,不依赖于数组的原始大小。
感谢。
答案 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
是指向数组第一个元素的指针。
您还应该将数组的元素数传递给函数。