指向内存分配的指针出现问题

Issue with pointers to memory allocation

本文关键字:问题 指针 内存 分配      更新时间:2023-10-16

考虑以下代码块:

  Byte* b = (Byte*) var.rawBuffer();
  b += sizeof (Byte) * 9;
  WhateverType* aptr = (WhateverType*) b;
  WhateverType* anotherptr = aptr;
  for (int i = 0; i < N; i++) {
    assert(*anotherptr == aptr[i]);
    anotherptr += sizeof (WhateverType);
  }

为什么断言有时会失败?使用[]运算符扫描分配的内存,并在起始内存地址上具有索引,是否等同于将指针地址按我尝试读取的数据类型的大小递增

问题是这一行:

anotherptr += sizeof (WhateverType);

anotherptrWhateverType*指针,而不是Byte*指针。对类型化指针执行算术时,总字节计数是指针声明为的类型的偶数倍。

因此,在上面的行中,您并没有告诉编译器仅将指针增加sizeof (WhateverType)字节数,就像您期望的那样。您实际上是在告诉它按sizeof(WhateverType)个元素数或换句话说,按sizeof(WhateverType) * sizeof(WhateverType)字节数递增指针。

T *pointer = ...;
pointer += N;

实际上等效于以下内容:

pointer = reinterpret_cast<T*>(reinterpret_cast<byte*>(pointer) + (sizeof(T) * N));

甚至语句aptr[i]的工作方式也相同,因为表达式 pointer[N] 只是 *(pointer + N) 的语法糖。

对于您正在尝试的内容,您需要将anotherptr指针递增N=1元素,而不是N=sizeof(WhateverType)元素数。 因此,请改用此内容:

anotherptr += 1;

或者更简单:

anotherptr++; // or: ++anotherptr;