“*(无符号整数*)((无符号整数)块 + n*i)”是什么意思
what is meaning of `*(unsigned int*)((unsigned int)block + n*i)`
void* block = ::operator new(n*size);
int i;
for(i = 0;i<BLOCK_SIZE -1;i++){
*(unsigned int*)((unsigned int)block + n*i) = (unsigned int)block + n*(1+i);
}
*(unsigned int*)((unsigned int)block + n*i) = 0;
问题>我无法理解上述代码的含义。似乎一个内存块指向下一个块内存。
有人可以向我解释一下吗?
block[0] = &block[1]
block[1] = &block[2]
block[2] = &block[3]
.
.
.
block[n] = 0 // dereferenced so not NULL, assigned zero as a value
AFAIS,它从头到尾指向下一个元素。尽管上面的演示看起来很简单,但它是代码背后的逻辑。
你已经得到了它几乎是正确的 - 它分配一个内存块,然后将其视为多个节点,并将它们作为链表链接在一起。
就目前而言,它看起来毫无意义,因为它没有分配任何内存来保存数据以及节点之间的链接(好吧,也许它确实如此 - 也许n
实际上大于sizeof(unsigned *)
并且size
大于BLOCK_SIZE
,因此它可以容纳更大的项目(。
如果我要做这样的事情,我可能会写更像这样的代码:
unsigned *block = (unsigned *)::operator new(n*size);
for (size_t i=0; i<size-2; i++)
block[i] = &block[i+1];
block[size-1] = nullptr;
当然,缺乏这样做的理由,这也是非常值得怀疑的 - 大多数代码可能都可以像这样的东西:
std::vector<unsigned *> block(size);
for (int i=0; i<size-2; i++)
block[i] = &block[i+1];
block[size-1] = 0;
相关文章:
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 从 std::string 转换为 const 无符号整数
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 计算机使用什么方法添加无符号整数
- “*(无符号整数*)((无符号整数)块 + n*i)”是什么意思
- 为什么尽管变量是无符号整数,但该程序仍以 -25 给出输出
- 是`-1`正确地用作无符号整数的最大值
- 无符号整数的负数会发生什么
- 如果我有一个固定大小的填充ascii数字的char数组,我知道它指的是一个无符号整数,那么将其转换为无符号整数的最快方法
- 按位左移一个带有 16 的无符号字符是什么意思
- c++支持原生无符号整数,而java不支持的优点是什么?
- 我的For循环出了什么问题?我得到警告:有符号和无符号整数表达式之间的比较[-Wsigncompare]
- c++中从字符串生成唯一无符号整数的最佳方法是什么?
- 基本级别的映射,"此常量表达式的类型为"const char*",而不是所需的"无符号整数"类型
- 模板语法和无符号类型是什么?
- 这是不可避免的有符号和无符号整数比较吗?