2010-01-02 3 views
0

작은 문제가 있습니다. objective-c 함수에서 c-function으로 전달할 때 배열 및 크기가 변경되었습니다.목표 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

관련 사항 : http://stackoverflow.com/questions/720077/calculating-size-of-an-array – whunmr

답변

6

C 배열에서 포인터는 매개 변수로 전달 될 때 포인터로 붕괴합니다. 이 관점은 단지 크기가 4

인 구문 int arr[20]를 이용하여 어레이를 선언 할 때, 크기는 컴파일 시간에 알려진 포인터의 년대 sizeof 연산자, void test(game_touch *tempTouches)에 전달 된 배열의 크기를 알 수있는 방법이 없기 따라서 sizeof은 실제 크기를 반환 할 수 있습니다.

5

C의 배열과 포인터는 많은 유사점을 가지고 있지만 작동 방식에 익숙하지 않은 경우 혼동을 일으킬 수 있습니다. 다음 진술 :

game_touch tempTouches[ [touches count] ]; 

배열을 정의하므로 sizeof (tempTouches)는 해당 배열의 크기를 반환합니다. 그러나 배열이 함수에 인수로 전달되면 포인터는 메모리에있는 공간의 포인터로 전달됩니다. 그래서 : 함수에

sizeof(tempTouches) 

배열의 크기가 아닌 포인터의 크기를 반환합니다.

1

test에서 tempTouches은 배열의 첫 번째 요소에 대한 포인터입니다.

또한 배열의 요소 수를 함수에 전달해야합니다.

관련 문제