【问题标题】:Void Pointer Arithmetic空指针算术
【发布时间】:2010-07-31 11:57:05
【问题描述】:

给定一个void 指针,如果我想让void 指针指向前面的x 字节,这将如何最好地完成?有没有比投射到 char 指针更好的方法?

【问题讨论】:

  • 我已经问了一个范围更广的问题,我想在这里做什么。我想知道是否有更好的方法,将 void* 转换为 char 的想法对我来说似乎是一种黑客行为。 stackoverflow.com/questions/3378090/custom-memory-manager
  • aCuria 我分享了这种感觉。因此,我在回答中已经链接了这两个问题。
  • 如果你有一个主要是 C 的程序,恰好使用了一些 C++ 特性,编译器会抱怨你程序中几乎所有的 void*。在我看来,编译器做错了,而不是程序员。因此需要一种解决方法,而不是重新设计完整的程序。

标签: c++


【解决方案1】:

有没有比强制转换更好的方法 一个字符指针?

否(除非以 char * 而不是 void * 开头,因此您根本不必强制转换)。

如果这是不可取或不可能的,那么唯一的方法是:

ptr = static_cast<char *>(ptr) + offset;

(注意:如果您在 C++ 中执行此类操作,通常会有更好的解决方案。除非您是专家并且已经排除了所有其他选择,否则我建议您发布一个新问题,询问是否有更好的方法来做你想做的事情!)

【讨论】:

【解决方案2】:

看看this questionthis question。总而言之,答案是转换为char * 进行字节级别的算术运算。

【讨论】:

    【解决方案3】:

    给定一个 void 指针,如果我想让 void 指针指向前面的 x 个字节,如何最好地做到这一点?有没有比转换为 char 指针更好的方法?

    如果你有一个void*,你不知道“x bytes ahead”是一个有效的地址。你不知道创建这样的指针不会让你的程序崩溃。

    这就是为什么它不能用void* 完成。

    您只能对指向数组的指针执行指针运算。如果你有一个指向数组的指针,你就知道数组的类型,并且可以使用等价的指针类型。

    如果你想要某种抽象的“字节指针”(比如说,如果你正在实现一个内存池并且需要指向一个缓冲区的特定偏移量),你应该使用char*unsigned char*,而不是void*.

    【讨论】:

      【解决方案4】:

      在进行指针算术编译时,编译器希望考虑到它对指针指向的类型的了解。

      例如,如果您有一个int *myint。那么这两个语句实际上做了同样的事情:

      int a = *(myint+5);
      

      int a = myint[5];
      

      在这种情况下,myint+5 不是“myint 的地址加 5”而是“myint 的地址加 5*sizeof(int))”

      所以在void * 的情况下,编译器无法做出任何假设void * + 5 应该是什么意思。因此,在您使用 void * 之前,它会强制您指定要如何使用它。

      【讨论】:

      • 它可以像 C 编译器那样假设 sizeof(void) = 1。但这当然太容易了。
      【解决方案5】:

      您可以将指针转换为普通整数,进行增量或任何操作,然后您可以将整数分配给该指针,希望对您有所帮助

      【讨论】:

        【解决方案6】:

        这是我的问题

        void *inputAudioBuffer;
        

        c++ 不允许我这样做

        UInt16 *inputBuffer = (UInt16 *)(inputAudioBuffer + inputBufferOffset);
        

        在进行类型转换后,我能够做到

        UInt16 *inputBuffer = (UInt16 *)( (UInt16 *) inputAudioBuffer + inputBufferOffset);
        

        【讨论】:

          【解决方案7】:

          与回答这个问题的其他人不同,在我看来,一个简单的+x(根本没有强制转换)就足以在您的 void 指针之前访问地址 x 字节。编译器可能不喜欢它,但至少在我使用它的情况下,它是有效的。我正在使用g++ (gcc)...

          所以只要你知道你在做什么,没有问题。

          【讨论】:

          • 在 C++ 中没有定义 void 指针的算术。 void 是一个不完整的类型,指针算法只适用于完全定义的类型。
          猜你喜欢
          • 2021-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 2010-09-28
          • 2012-07-27
          • 1970-01-01
          相关资源
          最近更新 更多