指向内存分配的指针问题

时间:2019-04-29 01:15:32

标签: c++ loops pointers

考虑以下代码块:

  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);
  }

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

1 个答案:

答案 0 :(得分:1)

问题是这一行:

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;