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]割り当てられたメモリの個々のバイトにアクセスします。asargListを宣言すると、上記で行ったように、個々の要素にインデックスを付けると、割り当てられたメモリがバイト単位でステップ実行されます。コンパイラは、ターゲット アーキテクチャの正しいポインター サイズを自動的に補正します。argListidargListsizeof(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 ビット モードで機能した理由がわかりません。

于 2009-10-08T02:42:12.950 に答える
0

Foundation で利用可能なコレクション クラスの 1 つではなく、C 配列に id を保持しているのはなぜですか?

于 2009-10-07T20:42:31.100 に答える