考虑以下代码块:
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);
}
为什么断言有时会失败?是否不使用[]
运算符扫描分配的内存,而在起始内存地址上有一个索引,相当于将指针地址增加我尝试读取的数据类型的大小?
答案 0 :(得分:1)
问题是这一行:
anotherptr += sizeof (WhateverType);
anotherptr
是WhateverType*
指针,而不是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;