【问题标题】:overflow? cannot find source, strange溢出?找不到来源,奇怪
【发布时间】:2015-01-22 08:05:48
【问题描述】:

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

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] 的内容(执行下面代码部分中的两行之一时会发生错误)。 i 属于 uint8_t 类型并且在限制范围内。

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

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

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

提前谢谢你

【问题讨论】:

  • 你在某处初始化 gUART
  • 您之前可能已经释放了该对象,并且该空间已重新分配给另一个对象。
  • 这是静态变量,因此应该默认初始化为零,对吧?无论如何,我不阅读未初始化的变量,它不会解释行为
  • 您是否为 *gUART 分配了内存?您不应该像这样直接将值写入指针:gUART->rx_length = i;
  • 在结构中写入值的正确方法是什么?

标签: c struct overflow


【解决方案1】:

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

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

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

要么你需要真正让指针指向某个地方,要么根本不将它们声明为指针。

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多