c++ - 如何使用不同的指针算术语义

标签 c++ pointers memory pointer-arithmetic

出于学术目的,我试图有目的地覆盖免费商店中分配的数据。以下是我目前所做的工作:

//main
int* val = new int(-1);

print_bits(*val);

short* i = new(val) short(0);
print_bits(*val);

std::cout << "\nval loc: " << val <<
             "\ni loc: " << i << std::endl;

delete val;
//end main

正如预期的那样,这会产生类似于:

11111111111111111111111111111111
00000000000000001111111111111111

val loc: 0x27d5580
i loc: 0x27d5580

我的下一个意图是覆盖 val 中的第二个字节,所以我只是将 short allocation 更改为:

short* i = new(val+1) short(0);

但是,进行此更改后,我得到了类似于以下内容的输出:

11111111111111111111111111111111
11111111111111111111111111111111

val loc: 0x27d5580
i loc: 0x27d5584

如您所见,val+1 将指针向前移动了一个完整的 sizeof(int) 字节,而不是仅仅向前移动了一个字节。我理解为什么会发生这种情况(并对此表示感谢)。但是,如果我的意图是在内存中只向前移动一个字节,我该如何实现呢?

编辑:

我想出的一个解决方案是做类似的事情

char* ch = &val;
short i = new(ch+1) short(0);

我实际上还不完全确定这是否会起作用,因为 char* 有被解释为 C 风格字符串的习惯。

解决方案:

给出的最简单的解决方案是写

short* i = new(reinterpret_cast<char*>(val)+1) short(0);

最佳答案

随便写

short* i = new(( char * )val + sizeof( short )) short(0);

short* i = new(reinterpret_cast<char *>( val ) + sizeof( short )) short(0);

关于c++ - 如何使用不同的指针算术语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47775886/

相关文章:

c++ - 私有(private)使用基构造函数的声明不是私有(private)的

c++ - 使用保留文件名返回正值时检查文件是否已创建

C++ 如何将结构数组初始化为 null,然后在 while 循环中检查该数组的元素是否为 null?

c - C 读取文件并返回指针

c - Valgrind 报告可能的堆栈溢出 - 这是什么意思?

java - 内存高效的多值映射

c++ - 对非抛出函数的困惑

c - 尝试在 C 中引用值时出现 LValue 错误

java - 我们可以从 java 应用程序内部限制 java 应用程序的内存吗?

c++ - 这个指针到底发生了什么