¿Cuáles son algunas técnicas para manejar con seguridad los dos punteros de 32 y 64 bits sin una macro condicional?
-
20-09-2019 - |
Pregunta
Estoy actualizando algo de código en una biblioteca porque he descubierto mi código original asumidos punteros de 32 bits. Tengo mis propias reflexiones de carácter sobre cómo solucionarlo, pero por la minuciosidad, quiero preguntar ¿cuáles son algunas de las técnicas que usaría para hacer este trabajo código para 32 y 64 bits sin una macro?
char *argList = (char *)malloc(sizeof(id *) * argumentsCount);
sizeof (id *) es 4 en 32 bits, 8 en 64 bits. Estoy usando char * argList para construir una matriz de punteros a objetos, a continuación, utilizando el método de getObjects NSArray:
[myNSArray getObjects:(id *)argList];
trabaja en 32 bits, 64 bits se bloquea en (por razones obvias)
Solución
A pesar de que no tengo todo el contexto, sospecho que esto no es realmente un problema de 32/64 bits. Lo que probablemente desea es algo a lo largo de las líneas de:
id *argList = malloc(sizeof(id) * argumentsCount);
Dependiendo de la situación, a veces me gusta para asignar bloques de memoria de este tipo con la asignación ya zero'd a cabo:
id *argList = calloc(1UL, sizeof(id) * argumentsCount);
Ambos asignar un trozo de memoria capaz de almacenar el número argumentsCount
de punteros a objetos. Puede acceder a los punteros individuales, así:
argList[0] = [[NSString alloc] initWithUTF8String:argv[0]];
argList[1] = [[NSString alloc] initWithUTF8String:argv[1]];
NSLog(@"Argument 0 is: %@", argList[0]);
Cuando se declara argList
como un puntero a char
tipo, como lo hizo en su ejemplo, la indexación de elementos individuales (es decir, argList[0]
, argList[1]
), accederá a los bytes individuales de la memoria asignada para argList
, no los punteros individuales a medida que probablemente esté esperando. Cuando se declara como argList
id
, como lo hice en lo anterior, la indexación de los pasos elementos individuales a través de la memoria asignada para argList
por bytes sizeof(id)
. El compilador compensará automáticamente el tamaño del puntero correcto para la arquitectura objetivo.
Si se asume que el puntero devuelto por malloc()
es 0x1000
, aquí está una tabla de las direcciones que se calcularían para el modo de 32 bits y 64 bits para char *
y id *
declaraciones:
32-bit: char * id * 64-bit: char * id *
argList[0]: 0x1000 0x1000 0x1000 0x1000
argList[1]: 0x1001 0x1004 0x1001 0x1008
No tengo ni idea de por qué esto alguna vez trabajó para que en el modo de 32 bits.
Otros consejos
¿Por qué estás guardando los identificadores en una matriz C en lugar de una de las clases de colección disponible en la Fundación?