0

我正在更新库中的一些代码,因为我发现我的原始代码假定为 32 位指针。我对如何修复它有自己的想法,但为了彻底起见,我想问一下你会使用哪些技术来使这段代码在没有宏的情况下同时适用于 32 位和 64 位?

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

sizeof(id *) 在 32 位上为 4,在 64 位上为 8。我使用 char *argList 来构建一个指向对象的指针数组,然后使用 NSArray 的 getObjects 方法:

[myNSArray getObjects:(id *)argList];

在 32 位下工作,在 64 位下崩溃(原因很明显)

4

2 回答 2

2

虽然我没有所有的上下文,但我怀疑这不是一个真正的 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,而不是您可能期望的单个指针。当你声明argListasid时,就像我在上面所做的那样,索引单个元素会逐步通过字节分配的argList内存sizeof(id)。编译器将自动为目标体系结构补偿正确的指针大小。

假设返回的指针malloc()is 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 位模式下对你有用。

于 2009-10-08T02:42:12.950 回答
0

为什么将 id 保存在 C 数组中,而不是 Foundation 中可用的集合类之一?

于 2009-10-07T20:42:31.100 回答