什么是一些技术来安全地处理32位和64位指针没有条件宏?
-
20-09-2019 - |
题
我更新库中的一些代码,因为我已经找到了我的原代码,假设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
存储器的单个字节,而不是作为你各个指针“再大概期待。当你声明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位模式为你工作。
其他提示
你为什么要保持在IDS C数组而不是集合类之一,提供基础?
不隶属于 StackOverflow