¿Cuáles son algunas técnicas para manejar con seguridad los dos punteros de 32 y 64 bits sin una macro condicional?

StackOverflow https://stackoverflow.com/questions/1533986

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)

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top