Хотя у меня нет всего контекста, я подозреваю, что это на самом деле не проблема 32/64 бит. Что вы, вероятно, хотите, это что-то вроде:
id *argList = malloc(sizeof(id) * argumentsCount);
В зависимости от ситуации, мне иногда нравится выделять блоки памяти таким образом, когда распределение уже обнулено:
id *argList = calloc(1UL, sizeof(id) * argumentsCount);
Оба из них выделяют кусок памяти, способный содержать argumentsCount
количество указателей на объекты. Вы можете получить доступ к отдельным указателям, например, так:
argList[0] = [[NSString alloc] initWithUTF8String:argv[0]];
argList[1] = [[NSString alloc] initWithUTF8String:argv[1]];
NSLog(@"Argument 0 is: %@", argList[0]);
Когда вы объявляете argList
как указатель на тип char
, как вы делали в своем примере, индексируя отдельные элементы (т. Е. argList[0]
, argList[1]
), получите доступ к отдельным байтам памяти, выделенной для argList
, а не отдельные указатели, как вы, вероятно, ожидаете. Когда вы объявляете argList
как id
, как я делал выше, индексация отдельных элементов проходит через память, выделенную для argList
на sizeof(id)
байт. Компилятор автоматически компенсирует правильный размер указателя для целевой архитектуры.
Предполагая, что указатель, возвращаемый malloc()
, равен 0x1000
, вот таблица адресов, которые будут рассчитаны для 32- и 64-битного режима для объявлений char *
и id *
:
32-bit: char * id * 64-bit: char * id *
argList[0]: 0x1000 0x1000 0x1000 0x1000
argList[1]: 0x1001 0x1004 0x1001 0x1008
Понятия не имею, почему это работало для вас в 32-битном режиме.