[英]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);
anotherptr
是WhateverType*
指针,而不是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.