C – Невозможно получить доступ к памяти по адресу

Когда отладка GDB сообщает мне следующую ошибку:

0x800c99ed00000001  

Ошибка возникает, если я поставил точку останова, когда я вызываю ConvertByteArrayToFloat во время отладки.

Но программа выходит без проблем и дает мне результат «Ок»?

Мой главный файл:

 #include "Local.h" int main(void) { if(HandleReceivedMessages() == OP_COMPLETED){ printf("Main Completed \n" ); } else { printf("Main Failed \n"); } return 0; } 

local.h

 #ifndef LOCAL_H_ #define LOCAL_H_ #include "Common.h" T_OP_STATUS HandleReceivedMessages(void); #endif 

Local.c

 #include "Handler.h" #include "Local.h" uint8_t message[] = {0x86, 0x9a, 0xa0, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x10, 0x4a, 0x00, 0x00, 0x00, 0x00, 0xe1}; uint8_t length = 16; T_OP_STATUS HandleReceivedMessages(void) { if(HandleResponseMessage(message, length) == STATUS_SUCCESS) { printf("Completed from Local \n"); return OP_COMPLETED; } else { printf("Failed from Local \n"); return OP_FAILED; } } 

Handler.h

 #ifndef HANDLER_H_ #define HANDLER_H_ #include "Common.h" T_MESSAGE_STATUS HandleResponseMessage(uint8_t *requestData, uint8_t msgLength); #endif /* HANDLER_H_ */ 

Handler.c

 #include "Handler.h" #include  static uint8_t rawRequestData[BUFFER_WIRED_SIZE]; static float TempFloat = 0; T_MESSAGE_STATUS HandleCmd(uint16_t cmdNumber, uint8_t rawDataLength, uint8_t *rawDataPtr) { switch (cmdNumber) { case 1: TempFloat = ConvertByteArrayToFloat(&rawDataPtr[3]); printf("The value of the float is : %f \n", TempFloat); return STATUS_SUCCESS; default: break; } return STATUS_NOT_IMPLEMENTED; } T_MESSAGE_STATUS HandleResponseMessage(uint8_t *message, uint8_t msgLength) { uint8_t cmdNumber, dataLength, startOfData; // Check the delimiter. if (message[0] & INDICATOR_UNIQUE_ADDRESS) { cmdNumber = message[6]; dataLength = message[7]; startOfData = 8; } else { cmdNumber = message[2]; dataLength = message[3]; startOfData = 4; } // we copy only the real data from the command response memcpy(&rawRequestData, message + startOfData, dataLength); return HandleCmd(cmdNumber, dataLength, rawRequestData); } 

common.h

 #ifndef COMMON_H_ #define COMMON_H_ #include  #include  #define BUFFER_WIRED_SIZE 128 #define INDICATOR_UNIQUE_ADDRESS 0x80 typedef enum { OP_FAILED, OP_COMPLETED, }T_OP_STATUS; typedef enum { STATUS_SUCCESS, STATUS_NOT_IMPLEMENTED, } T_MESSAGE_STATUS; float ConvertByteArrayToFloat(uint8_t *data); #endif /* COMMON_H_ */ 

common.c

 #include "Common.h" float ConvertByteArrayToFloat(uint8_t *data) { union { uint8_t tmpArray[4]; float tmpFloat; } value; value.tmpArray[0] = data[3]; value.tmpArray[1] = data[2]; value.tmpArray[2] = data[1]; value.tmpArray[3] = data[0]; return value.tmpFloat; } 

Это минимальная версия (она выполняет множество функций, таких как проверка формата сообщения, CRC и т. Д.), Но идет от начала до конца через все эти файлы.

Я работаю над встроенной платформой, а когда отлаживаю свой микроcontroller и вызывая функцию ConvertByteArrayToFloat, моя программа перескакивает на другую часть моего кода, а затем выдает микроcontroller.

Я пытаюсь воссоздать ошибку на своем компьютере без микроcontrollerа, и я нашел ошибку наверху.

Это:

 TempFloat = ConvertByteArrayToFloat(&rawDataPtr[3]); 

(где rawDataPtr является аргументом uint8_t * ) выглядит очень подозрительно. Вы передаете указатель на четвертый байт в rawDataPtr (тот же, что и rawDataPtr + 3 ), чтобы преобразовать функцию, которая затем будет читать четыре байта, начиная с этого места.

Это выглядит как путаница после потребления начальных байтов сообщения.