Размер массива C с целыми числами (в Obj-C) - PullRequest
0 голосов
/ 24 января 2011

myclass.h:

#define BUTTON_NAVI 41;
#define BUTTON_SETTINGS 42;
#define BUTTON_INFO 43;

myclass.m:

int btnNavi = BUTTON_NAVI;
int btnSettings = BUTTON_SETTINGS;
int btnArray[2] = {btnNavi, btnSettings};
NSLog(@"count = %i", sizeof(btnArray));
[self addToolbarButtons:btnArray];

-> Журнал: count = 8

8 ?!Что я сделал не так?

А внутри "addToolbarButtons" счетчик равен 4 ...: - (

РЕДАКТИРОВАНИЕ:

- (void)addToolbarButtons:(int[])buttonIdArray {
    NSLog(@"count = %i", sizeof(buttonIdArray));
}

-> Журнал: count = 4

Ответы [ 3 ]

3 голосов
/ 24 января 2011

sizeof дает вам размер в байтах, 8 байтов звучат правильно для 2 целых чисел (32-бит или 4 байта каждое).

Если вы хотите, чтобы длина из массива, вы можете сделать sizeof(arr) / sizeof(arr[0]), который даст вам размер всего массива, деленный на размер каждого элемента.В этом случае вы получите 8 / 4 == 2, что, как я понимаю, вы ожидаете.

EDIT Чтобы ответить на ваш второй вопрос, когда вы передаете массив методу, выфактически передавая указатель в массив.Следовательно, размер указателя также составляет 32 бита или 4 байта.Если вы хотите, чтобы функция знала длину массива, вам нужно также передать ее длину вместе с указанным указателем.

2 голосов
/ 24 января 2011

sizeof дает размер массива в байтах. Значение типа int равно 4 байтам, поэтому массив элементов из 2 элементов будет иметь размер 8 байт.

Однако sizeof не будет делать то, что вы хотите в вашем методе. Когда массив C передается в функцию (или метод), он фактически передается как указатель, и sizeof возвращает размер указателя. Вы должны изменить свой метод, чтобы он принимал параметр длины:

- (void)addToolbarButtons:(int *)buttonIdArray length:(size_t)len
{
    NSLog(@"count = %d", len);
}
0 голосов
/ 24 января 2011

Оператор sizeof дает вам размер в байтах того, что вы ему передаете.Если int равно 4 байта, то массив из двух int s равен 8 байтов.

Однако sizeof - это проверка во время компиляции самой переменной.Во время выполнения границы массива неизвестны, равно как и не известны за пределами области, в которой была определена переменная.Когда вы объявляете аргумент (int[])buttonIdArray, компилятор обнуляет его как (int *)buttonArray - это просто обычный указатель на int.Поэтому, когда вы делаете sizeof(buttonArray), он сообщает вам размер указателя, 4.

Поскольку язык не отслеживает их размер для вас, использование массивов Си - боль.Вы должны передать количество элементов в массиве каждой функции и методу, которые на него воздействуют.

...