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]返回 a char,不太可能是有效地址。好像你打算写:

virtualFlash + virtualFlashAddress

wherevirtualFlashAddress是应用于基地址virtualFlash(即数组中第一个元素的地址)的偏移量。

该名称virtualFlashAddress令人困惑,因为它被用作该数组的索引,但这是我最好的猜测,没有看到更多代码。

于 2012-10-08T20:17:10.810 回答