3

他の人の C++ を (Objective) C に変換していますが、memcpy. 次のように使用します。

memcpy((void *)virtualFlash[virtualFlashAddress], data, dataLength);

変数は次のように定義されます。

unsigned char virtualFlash[5 * 1024 * 1024]; // 5MB
NSUInteger virtualFlashAddress; // set to 8 later on
unsigned char *data = (unsigned char *)[recordData bytes]; // recordData is an NSData object
NSUInteger dataLength = [recordData length]; // same NSData object

memcpy の行に EXC_BAD_ACCESS が表示されます。recordDataを返し<d8ffbd27 2000b1af 1c00b0af 2400bfaf>た と、16 を返した dataLengthをデバッグしました。両方とも正しいです。

memcpy((void*)virtualFlash[8], data, 16);

これはクラッシュします。私はmemmove時々それが機能することを読みましたが、私の場合はそうではありません(同じEXC_BAD_ACCESS)。これは、正常に動作する C++ プログラムからほぼ正確にコピーされているため、どうすればよいかわかりません。C に関する私の知識はごくわずかなので、明らかな何かを見落としている可能性があります。

4

1 に答える 1

3
unsigned char virtualFlash[5 * 1024 * 1024]; // 5MB

スタックは、5MB の割り当てに対応するのに十分な大きさである場合とそうでない場合があります。仮にそうだったとしても、それは実際には少し押し上げているので、私はその量を動的に割り当てます。次の問題:

(void *)virtualFlash[virtualFlashAddress]

virtualFlash[virtualFlashAddress]charは、有効なアドレスである可能性が低い を返します。あなたが書くつもりだったようです:

virtualFlash + virtualFlashAddress

virtualFlashAddressは、ベース アドレスvirtualFlash(つまり、配列の最初の要素のアドレス) に適用されるオフセットです。

その配列へのインデックスとして使用されているため、名前virtualFlashAddressは紛らわしいですが、それ以上のコードを見ない限り、それが私の最善の推測です。

于 2012-10-08T20:17:10.810 に答える