【问题标题】:GCC Error: Invalid operands to binary +GCC 错误:二进制操作数无效 +
【发布时间】:2012-01-24 15:41:30
【问题描述】:

为什么 GCC 会给我这个错误?我在这里做错了什么?

 temp.c: In function main:
 temp.c:6: error: invalid operands to binary +

代码:

 main()
 {
     char *Address1,*Address2,*NewAddress;
     Address1= (char*)0x12;
     Address2= (char*)0x34;
     NewAddress = Address1+Address2;
 }

【问题讨论】:

  • 不能添加指针。为什么你会想要?添加一个指针和一个偏移量确实有意义,但不是两个指针...

标签: c pointers gcc binary


【解决方案1】:

你为什么要这么做?

C 语言禁止添加两个指针。它只定义(有严格限制)指针和整数的相加。

基本上,您只能向指针添加一个足够小的整数,以使结果位于某个已分配内存区域的内部或结束边界处。

【讨论】:

  • 我认为由用户来确保地址不会超出分配的空间。为什么 C 会施加这种限制?
  • C 语言标准说——用更政治正确的话来说——如果指针“不指向任何地方”,则行为是未定义的。未定义的行为实际上意味着任何东西:爆炸计算机是未定义行为的有效实现。
【解决方案2】:

C 不允许添加两个指针。我找到的最好的解释,没有触及任何标准,是鲁本·罗斯塔米安的引言:

如果你和我住在同一条街上,我们家的不同 数字是我们房屋之间距离的某种指示。

现在,你告诉我,我们家的总和有什么意义 数字?

所以整个操作没有任何意义。这很符合逻辑,不是吗?但是,您可以这样做:

NewAddress = (char *)(0x12 + 0x34);

【讨论】:

    【解决方案3】:

    你不能把指针加在一起,那太荒谬了。

    允许向指针添加整数值:

    char *Address1,*NewAddress;
    unsigned Offest;
         Address1= (char*)0x12;
         Offset= 0x34;
         NewAddress = Address1+Offset
    

    【讨论】:

      【解决方案4】:

      在 C 中,您不能添加两个指针。如果您考虑一下,尝试在逻辑上没有任何意义。要解决此问题,您可以在添加之前将其中一个指针转换为整数值:

      NewAddress = (long)Address1 + Address2;
      

      【讨论】:

        【解决方案5】:

        因为这些变量是指针,请尝试转换为int

        NewAddress = (char *)((int)Address1 + (int)Address2);
        

        【讨论】:

          【解决方案6】:

          这些答案很糟糕。我接受最近的 C 标准可能会弃用该功能,但添加和减去指针是有正当理由的,例如当一个是相对的或者您想创建一个相对地址时。 C 一直旨在成为高级汇编程序,而相对寻址是所有现代 CPU 中的基本 OP。

          至于建议的解决方案:非常糟糕的做法是将每个指针转换为整数然后减去,因为指针可能不适合整数。但是 (INT)(p2-p1) 应该是安全的,假设 P1 和 P2 地址在同一个上下文中,即已知在同一个缓冲区中。

          【讨论】:

          • C中的指针中没有存储相对地址,如果要偏移量,可以给指针加一个整数。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多