c++ - 指向内存分配的指针问题

标签 c++ loops pointers

考虑以下代码块:

  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/

相关文章:

c++ - 如何读取文件中的文件?

c++ - 如何解决 LNK2001/2005 问题?

java - 循环结构,很困惑

javascript - 如果所有 JavaScript 类型都是对象,那么为什么数字要按值传递?

c - 数组/指针和 scanf

C 编程 - 指针(带增量)

c++ - 暂停 boost::thread 无限时间

c++ - 设置我的应用程序 api 感知并防止系统使其模糊和错误定位

r - 在 R 中的循环中创建一个列表对象

c++ - 字符指针(由 new 分配)及其初始化