【问题标题】:Pointer arithmetic with a void pointer带有 void 指针的指针算术
【发布时间】:2014-07-18 08:59:07
【问题描述】:

我想知道是否有更好的方法,而不是将 void 指针转换为 uint8_t,然后根据偏移量进行算术运算,然后将其转换为 uint32_t,然后取消引用以在该确切偏移量处获得 4 字节值.

void * foo = malloc(1024);
uint32_t myVar;

for(int i = 0; i < 10; i++)
{
  myVar = *((uint32_t*)((uint8_t *) foo + nOffset));
  nOffset += 100;
}

【问题讨论】:

  • 离题:i &lt; 10i&gt; 10 更有意义。
  • 为了稍有改进,请使用char 而不是uint8_t。这不是您在这里关心的位宽,而是指针的元素大小。根据定义,sizeof(char) 为 1。
  • @luserdroog 除非数据实际上是字符,否则使用uint8_t 更有意义。虽然在几乎所有现代平台上都没有区别,但将其作为通用 uint8_t 在阅读代码时会给出一些语义提示。
  • @JoachimPileborg 同意。我担心的正是这些语义暗示。它没有传达(对我)任何实际意义。我只是盯着它,想知道为什么不是char
  • 由于代码通常具有未定义的行为,是否真的值得研究哪种未定义的行为看起来最漂亮?

标签: c pointers


【解决方案1】:

您最好只停留在指针运算的一个“域”内。

你应该这样做 uint32_t * foo = malloc(1024);

然后是

myVar = foo + nOffset / sizeof(*foo);
nOffset += 100;

myVar = foo + nOffset;
nOffset += 100 / sizeof(*foo);

每一步前进 100 个字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2021-04-29
    • 2021-02-15
    • 2014-05-30
    • 2011-04-01
    相关资源
    最近更新 更多