2012-10-08 103 views
2

我將別人的C++到(目標)C,但我有與memcpy問題。我用它如下:的memcpy導致EXC_BAD_ACCESS

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>,dataLength返回了16 - 都是正確的。

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

這個崩潰了。我讀過memmove的作品,但在我的情況下(與EXC_BAD_ACCESS相同)。我不確定該怎麼做,因爲這幾乎完全是從C++程序中複製而來的,因爲它可以正常工作。我對C的知識非常少,所以我可能會錯過一些明顯的東西。

+1

很可能5MB的分配'virtualFlash'堆棧失敗這是不確定的行爲。你能確認這不會發生嗎? –

+3

不知道的Objective-C,但在C,'virtualFlash [8]'將是一個'char',如果你投的是爲'無效*',你會得到一個地址,天知道在哪裏。 Didi你的意思是'(void *)&virtualFlash [8]'也許可以複製到'virtualFlash'數組中? –

+0

我不知道如果Objective-C的支持'virtualFlash + 8'但是這可能是在從一開始偏移開始副本的最簡單的方法。 – Wug

回答

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

你的籌碼可能會或可能不會大到足以容納一個5MB的分配。即使是這樣,這真的會推動一點,我會動態地分配這個數量。 下一個問題是:

(void *)virtualFlash[virtualFlashAddress] 

virtualFlash[virtualFlashAddress]返回char,不可能是一個有效的地址。好像你的意思是寫:

virtualFlash + virtualFlashAddress 

virtualFlashAddress是偏移施加到基地址virtualFlash(即,陣列中的第一個元素的地址)。因爲它被用作索引到該數組

名稱virtualFlashAddress是混亂的,但是這是沒有看到更多的代碼,我最好的猜測。

+0

啊,是的,&確實缺少......我沒有解決5MB的問題,但它不再崩潰了。這是我應該看看嗎? –

+0

在OS X上,主線程的默認堆棧大小爲8MB(我不記得iOS的默認大小);而一個5MB緩衝區不一定會導致崩潰,因此放入堆棧相當大。 –

+0

好吧,我明白那可能是一個問題,然後將研究它。感謝所有的快速幫助! –

相關問題