2010-01-02 6 views
0

У меня небольшая проблема. У меня есть массив и его размер изменяется при переходе к c-функции из функции object-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 

Почему размер отличается в 2 методов?

В методе [test] возвращаемый размер всегда 4, не зависящий от исходного размера массива.

Спасибо.

+0

связанные: http://stackoverflow.com/questions/720077/calculating-size-of-an-array – whunmr

ответ

6

В массивах C распадаются на указатели, когда они передаются как параметры. Оператор sizeof не имеет возможности узнать размер массива, переданного в void test(game_touch *tempTouches), от его точки зрения, это просто указатель, размер которого равен 4.

При объявлении массивов, используя следующий синтаксис int arr[20], размер известно во время компиляции поэтому sizeof можно вернуть реальный размер.

5

Хотя массивы и указатели в C имеют много общего, это один из тех случаев, когда, если вы не знакомы с тем, как они работают, это может сбить с толку. Данное заявление:

game_touch tempTouches[ [touches count] ]; 

Определяет массив, поэтому sizeof (tempTouches) возвращает размер этого массива. Однако, когда массивы передаются как аргументы для функций, они передаются как указатели на пространство в памяти, которое они занимают. Итак:

sizeof(tempTouches) 

в функции возвращает размер указателя, который не является размером массива.

1

В test, tempTouches является указателем на первый элемент массива.

Вы также должны передать количество элементов массива функции.

Смежные вопросы