考虑以下代码块:
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)
字节数递增指针.
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;
关于c++ - 指向内存分配的指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55895931/