指向内存分配的指针出现问题
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)
字节数递增指针。
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++ 函数中指针赋值的简单问题
- 链表指针问题
- C++ 关于指针取消引用的技术问题
- C++中的指针和常量问题不大
- 包含矢量指针的结构的内存释放问题
- 指针问题:从不兼容的类型"int"分配给"int *"
- 将字节数组转换为带有字节序问题的指针
- 关于如何使用指向主窗口的指针的 QT 问题
- 当成员值从指针更改为非指针时,C++常量问题
- 为什么循环会导致指针出现问题?
- 使用指针计算堆栈问题的大 O 表示法
- 构造函数 (C++) 中的 char 指针参数存在问题
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- 涉及指针和手动实现的矩阵类的问题
- 从基指针到派生的强制转换问题
- 迭代器的指针操作问题
- 64 位迁移问题:指针更改
- C++模板使用问题指针
- 跳到C++第13章练习问题4-指针
- 用std::pair数组初始化std::map问题(指针错误?)