我更新库中的一些代码,因为我已经找到了我的原代码,假设32位指针。我有我自己对如何解决它的思路,但对于彻底,我想问的是一些技巧,你会使用,使两个32位和64位的代码工作,而宏?

char *argList = (char *)malloc(sizeof(id *) * argumentsCount);

的sizeof(ID *)为4在32位,8上的64位。我使用的char * ARGLIST建立指针数组的对象,然后使用NSArray的getObjects方法:

[myNSArray getObjects:(id *)argList];

在32位的工作原理,在64位的崩溃(由于明显的原因)

有帮助吗?

解决方案

虽然我没有所有的背景下,我怀疑这是不是一个真正的32/64位问题。你可能想要的是沿着线的东西:

id *argList = malloc(sizeof(id) * argumentsCount);

根据情况,有时我喜欢与已经zero'd出分配分配内存块是这样的:

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存储器的单个字节,而不是作为你各个指针“再大概期待。当你声明argListid,正如我在上面做了,索引通过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位模式为你工作。

其他提示

你为什么要保持在IDS C数组而不是集合类之一,提供基础?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top