c - 尝试更新数组元素时出错

标签 c arrays pointers struct typedef

我在没有调试功能的嵌入式平台上工作。所以很难说错误来源是什么。

我在头文件中定义了:

typedef struct cm_packet {
  CM_Header Header; //header of packet 3 bytes
  uint8_t *Data; //packet data 64 bytes
  CM_Footer Footer; //footer of  packet 3 bytes
} CM_Packet;

typedef struct cm_inittypedef{
  uint8_t               DeviceId;
  CM_Packet             Packet;        
} CM_InitTypeDef;

extern CM_InitTypeDef cmHandler;
void CM_Init(CM_InitTypeDef *handler);    
CM_AppendResult CM_AppendData(CM_InitTypeDef *handler, uint8_t identifier
                              , uint8_t *data, uint8_t length);

在实现的某个地方我有:

uint8_t bufferIndex = 0;

void CM_Init(CM_InitTypeDef *cm_initer) { //init a handler
  cmHandler.DeviceId = cm_initer->DeviceId;  

  CM_Packet cmPacket;  
  cmPacket.Header.DeviceId = cm_initer->DeviceId;
  cmPacket.Header.PacketStart = CM_START;
  cmPacket.Footer.PacketEnd = CM_END;
  //initialize data array
  uint8_t emptyBuffer[CM_MAX_DATA_SIZE] = {0x00}; 
  cmPacket.Data = emptyBuffer;

  cm_initer->Packet = cmPacket;
}

CM_AppendResult CM_AppendData(CM_InitTypeDef *handler, uint8_t identifier
                              , uint8_t *data, uint8_t length){    
    //some check to see if new data does not make Data overflow             

    uint8_t i;

    /*** ERROR HAPPENS HERE!!!! ***/
    handler->Packet.Data[bufferIndex++] = identifier;

    //now add the data itself
    for(i = 0; i < length; i++) {
     handler->Packet.Data[bufferIndex++] = data[i];
    }

    //reset indexer
    if(bufferIndex > 64) {
       PacketReady(); //mark packet as ready
       bufferIndex = 0 
     };

    //return result
}

想法是从一些可以访问handler 的其他源代码更新Packet.Data。例如,一些其他来源可以调用该 Append 函数来更改 Packet.Data。但是正如您在代码中看到的那样,我已经对导致微 Controller 进入硬故障模式的地方进行了注释。我不确定这里发生了什么。我所知道的就是在那条线上微进入硬故障模式并且永远不会恢复!

这可能是一个竞争条件,但首先我想知道我写了正确的 c !!!代码,然后我尝试排除其他问题。

最佳答案

在函数 CM_Init 中,您将 cmPacket.Data 设置为指向本地数组:

uint8_t emptyBuffer[CM_MAX_DATA_SIZE] = {0x00};
cmPacket.Data = emptyBuffer;

在函数范围之外访问此内存地址会产生未定义的行为。

关于c - 尝试更新数组元素时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30812942/

相关文章:

c - 简单 OpenGL 应用程序中的 “Access violation reading location 0x000000000”

c - 获取管道利用率?

c++ - memcpy 中的指针运算有奇怪的结果

c++ - 从指针返回对象时意外的析构函数调用

c++ - 是否应该使用指针来减少 header 依赖性?

Java 相当于 C 中的 perror

c - C 中的双向链表引发段错误问题

java - Java 中令人费解的数组赋值行为

arrays - 如何转换此语句以获得更好的性能

java - 如何调用从 JNI 返回数组的 C++ 方法并将数组的内容转换为 java 类数组?