【问题标题】:Warning: pointer of type 'void *' used in subtraction警告:减法中使用了“void *”类型的指针
【发布时间】:2010-04-26 03:06:55
【问题描述】:

虽然它运行正确,但会导致上述编译器警告:

return ((item - (my->items))/(my->itemSize));

'item' 是一个 'void *'; 'my->items' 是一个 'void *'; 'my->itemSize' 是一个 'int'

将 'item' 和 'my->items' 转换为 'int *' 导致程序运行不正常。消除警告的最佳方法是什么?

【问题讨论】:

  • 作为一般经验法则,不要使用无类型 (void*) 变量...
  • 我明白,但我使用 void * 因为我正在尝试实现一个通用结构
  • 我个人更喜欢return (item - my->items) / my->itemSize;(少两对括号),但这并不重要。

标签: c


【解决方案1】:

使用指针的加法和减法适用于指向类型的大小:

int* foo = 0x1000;
foo++;
// foo is now 0x1004 because sizeof(int) is 4

从语义上讲,void 的大小应该为零,因为它不代表任何东西。因此,void 指针上的指针运算应该是非法的。

但是,由于多种原因,sizeof(void) 返回 1,并且算术运算就像是 char 指针一样工作。但是,由于它在语义上不正确,因此您确实会收到警告。

要取消警告,请使用char 指针。

【讨论】:

  • 我通常对 unsigned char * 作为 C 中的原始数据元素感到高兴,而不是 char *,它暗示事物是 C 风格的字符串。否则,这是一个完美的答案。
  • 如果 C 定义了一个可以像char 那样访问内存但不是整数类型的“位块”类型会很有帮助。出于此类目的使用 char* 可能已被弃用,取而代之的是适当的“位袋”类型,并且沙盒实现能够提供比可以对原始字节进行算术运算的代码更强大的保证。
【解决方案2】:

转换为char *:

return ((char *)item - (char *)my->items)/my->itemSize);

由于 char 的大小为 1 字节,您将得到您期望的值与您的 int * 指针示例,该示例计算两个地址之间有多少 ints。这就是指针算法的工作原理。

【讨论】:

    【解决方案3】:

    问题是您在指针中进行算术运算,我想知道它是如何正常运行的。

    【讨论】:

    • 指针算术没有问题,我看错了代码,以为他在做普通的数学,而不是指针。我的坏:)
    【解决方案4】:

    如果您尝试进行普通算术,则必须取消引用指针(例如*item)。如果您尝试进行指针运算,则指针必须是一种类型,例如char*int*(否则编译器将不知道要增加多少)。

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2016-09-25
      • 1970-01-01
      • 2021-05-27
      • 2014-06-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多