指向struct的指针成员

时间:2012-09-14 12:17:41

标签: c pointers struct 8051

我的编译器收到错误如下:

  

C51 COMPILER V9.01 - SN:C1ADC-HAI60D COPYRIGHT KEIL ELEKTRONIK GmbH   1987年至2009年    *警告C260在SEQUENCE.C的第300行中:'=':指针截断   * 错误C190在SEQUENCE.C第301行:'&':不是左值

以下是我的代码:

   struct myCond{
    unsigned char currStatus;
    unsigned char prevStatus;
    unsigned int *timer;
    unsigned char *flag;
   }
  struct myCond StatCond;

  unsigned int data timerdata;
  bit bdata timeflag;

  void someSubroutine (void)
  {
    struct myCond *tempCond;

tempCond = &StatCond;
tempCond->timer = &((unsigned int)timerdata);
tempCond->flag = &((unsigned char)timeflag);
  }

2 个答案:

答案 0 :(得分:3)

我们应该猜猜哪一行是301?

据我所知,这些问题在这里:

tempCond->timer = &((unsigned int)timerdata);
tempCond->flag = &((unsigned char)timeflag);

(unsigned int)timerdata(unsigned char)timeflag是值,r-values是准确的。与普通l-valuestimerdata不同的timeflag不同,我们无法对其进行修改或分配。因此,您无法使用r-values获取&的地址。这与编写&1一样。 1本身不作为数据存储器中的对象存在。

你应该写:

tempCond->timer = &timerdata;
tempCond->flag = (unsigned char*)&timeflag;

我不太确定采用位变量的地址是合法的。最后一行可能无法编译。

也许重新定义结构会有所帮助:

struct myCond{
...
    bit bdata *flag; // or maybe without bdata
   }

然后你会写tempCond->flag = &timeflag;

答案 1 :(得分:1)

unsigned int data timerdata;  // what is 'data', is it defined?
bit bdata timerflag;  // what are 'bit' and 'bdata', are they defined?

根据上述问题检查您的代码。在真正的攻击之后,编译器错误通常会报告多行。