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等等),但是从头到尾都是通过所有这些文件。

我正在开发一个嵌入式平台,当我在微控制器中调试并调用ConvertByteArrayToFloat函数时,我的程序会跳转到代码的其他部分,然后它会使微控制器崩溃。

我尝试在没有微控制器的情况下在计算机中重新创建错误,我在顶部发现了错误。

这个:

 TempFloat = ConvertByteArrayToFloat(&rawDataPtr[3]); 

(其中rawDataPtr是一个uint8_t *参数)看起来非常可疑。 您将指向rawDataPtr的第四个字节(与rawDataPtr + 3相同)的指针传递给转换函数,然后从该位置开始读取四个字节。

在消耗了消息的初始字节之后,这看起来有些混乱。