溢出?找不到来源,奇怪

时间:2015-01-22 08:05:48

标签: c struct overflow

我的项目中有以下两个结构

typedef volatile struct {
  unsigned char rx_buf[MAX_UART_BUF];   //Input buffer over UART
  uint8_t rx_flag;                  //Indicates received data over UART
  uint8_t rx_length;                    //length of the input buffer
} UART;

UART *gUART;

typedef volatile struct {
  unsigned int target_s[NR_BLDC];       //Target Position in Signals
  int distance_s[NR_BLDC];          //Distance between gActual_s[NR_BLDC] and gTarget_s
  unsigned int old_s[NR_BLDC];      //Position before starting to new destination
  unsigned int ramp_s[NR_BLDC];     //Duration of ramp(accelerate/decelerate) in Signals
  unsigned int count_dt[NR_BLDC];       //Actual nr of PWM ISR timer calls
  uint8_t dc_max[NR_BLDC];          //Maximal Duty Cycle set to reach the destination
} POSITIONING;

POSITIONING *gPOS;

当我写入* gUART中的rx_flag或rx_length时,它会以某种方式更改* gPOS结构中distance_s [0]的内容(在执行下面代码部分中的两行之一时会发生错误)。我的类型为uint8_t且在限制范围内。

            gUART->rx_length = i;                       //set receive byte length
            gUART->rx_flag = 1;                         //Indicate that data ready for use

我不知道这是怎么发生的,因为即使它是溢出,两个结构也至少在bss部分中被多个字节隔开。

如何找到错误的任何技巧/想法。

提前谢谢

1 个答案:

答案 0 :(得分:0)

由于您不会显示更多代码,因此我必须做出两个假设:前缀为g的变量是全局的,并且您不会初始化这些指针(即让它们指向任何地方。)

未初始化的全局变量由编译器零初始化。对于指针,这意味着它们被初始化为NULL,这意味着两个指针都指向NULL。取消引用NULL指针会导致undefined behavior

在您的特定情况下,您非常幸运整个应用程序不会崩溃和刻录,更具体地说,因为两个指针都指向NULL,它们都指向相同的内存,这意味着改变一个结构将改变两者。

要么你需要实际指向某个指针,要么根本不将它们声明为指针。