Was sind einige Techniken, um sicher sowohl 32-Bit- und 64-Bit-Zeiger ohne bedingten Makro zu umgehen?

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

Frage

Ich bin Aktualisierung einige Code in einer Bibliothek, weil ich 32-Bit-Zeiger angenommen meiner ursprünglichen Code herausgefunden haben. Ich habe meine eigenen gedanken darüber, wie es zu beheben, aber für Gründlichkeit, möchte ich fragen, was einige Techniken sind Sie diesen Code machen Arbeit sowohl für 32-Bit- und 64-Bit ohne Makro verwenden würden?

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

sizeof (id *) 4 auf 32-Bit, 8 auf 64-Bit. Ich verwende char * argList ein Array von Zeigern auf Objekte zu bauen, dann NSArray die getObjects Methode:

[myNSArray getObjects:(id *)argList];

arbeitet in 32Bit, stürzt in 64-Bit (aus offensichtlichen Gründen)

War es hilfreich?

Lösung

Obwohl ich nicht alle Rahmen, vermute ich, dass dies nicht wirklich ein 32/64 Bit Problem. Was Sie wahrscheinlich wollen, ist etwas entlang der Linien von:

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

Je nach Situation, ich manchmal wie mit der Zuteilung wie diese Speicherblöcke zugewiesen werden bereits zero'd aus:

id *argList = calloc(1UL, sizeof(id) * argumentsCount);

Beide weisen Sie einen Teil des Speichers der Lage argumentsCount Anzahl von Zeigern auf Objekte zu halten. Sie können die einzelnen Zeiger zugreifen wie folgt:

argList[0] = [[NSString alloc] initWithUTF8String:argv[0]];
argList[1] = [[NSString alloc] initWithUTF8String:argv[1]];
NSLog(@"Argument 0 is: %@", argList[0]);

Wenn Sie argList als Zeiger auf char Art erklären, wie Sie in Ihrem Beispiel haben, Indizierung einzelner Elemente (dh argList[0], argList[1]), werden die einzelnen Bytes des für argList reservierten Speicher zuzugreifen, nicht die einzelnen Zeiger, wie Sie ‚re erwartet wahrscheinlich. Wenn Sie erklären argList als id, wie ich in der oben tat, Indizierung einzelner Elemente Schritten durch die für argList von sizeof(id) Bytes zugewiesenen Speicher. Der Compiler wird für die korrekte Zeigergröße für die Zielarchitektur automatisch kompensieren.

Unter der Annahme, dass der Zeiger von malloc() zurück 0x1000 ist, dann ist hier eine Tabelle der Adressen, die für char * und id * Erklärungen für 32 und 64-Bit-Modus berechnet werden würde:

    32-bit: char *  id *     64-bit: char *  id *
argList[0]: 0x1000  0x1000           0x1000  0x1000
argList[1]: 0x1001  0x1004           0x1001  0x1008

Ich habe keine Ahnung, warum dies jemals für Sie in 32-Bit-Modus gearbeitet.

Andere Tipps

Warum sind Sie ids in einem C-Array statt einem der Sammlung Klassen in Foundation halten?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top