繁体   English   中英

指向内存分配的指针问题

[英]Issue with pointers to memory allocation

考虑以下代码块:

  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) * sizeof(WhateverType)个字节数来增加指针。

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

实际上等效于以下内容:

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

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

对于您要尝试的操作,您需要将anotherptr指针增加N=1元素,而不是增加N=sizeof(WhateverType)个元素。 因此,请改用此:

anotherptr += 1;

或更简单:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM