memcpy приводит к EXC_BAD_ACCESS

Я конвертирую чужой 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 

Я получаю EXC_BAD_ACCESS в строке memcpy. Я отлаживал recordData , который возвращал и dataLength, который возвратил 16 – оба правильные.

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

Это сбой. Я читал, что memmove работает иногда, но не в моем случае (тот же EXC_BAD_ACCESS). Я не уверен, что делать, поскольку это почти точно скопировано из программы на C ++, в которой она работает нормально. Мои знания о C очень минимальны, поэтому мне может не хватать чего-то очевидного.

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

Ваш стек может быть или не быть достаточно большим, чтобы разместить распределение 5 МБ. Даже если это так, это действительно немного подталкивает его, и я бы выделил эту сумму динамически. Следующая проблема:

 (void *)virtualFlash[virtualFlashAddress] 

virtualFlash[virtualFlashAddress] возвращает char , который вряд ли будет действительным адресом. Похоже, вы хотели написать:

 virtualFlash + virtualFlashAddress 

Где virtualFlashAddress – это смещение, применяемое к базовому адресу virtualFlash (т. virtualFlash Адрес первого элемента в массиве).

Имя virtualFlashAddress запутанно, поскольку оно используется как индекс в этом массиве, но это мое лучшее предположение, не видя больше кода.