如何将内存地址映射到变量以在该内存位置创建结构?我尝试了以下代码在给定的内存地址处创建一个结构,但它只是转储了分段错误?
代码中的内存位置是一个输入区域,我需要在其中设置某些数据并使用操作码按门铃,以便 CPU 获取输入数据并按照操作码所说的处理输入区域中的数据
some_struct* some_struct_obj= (some_struct*)0xc321000000;
memset(some_struct_obj, 0x00, sizeof(some_struct));
将内存地址映射到变量
在 C++ 中没有办法选择任何变量的确切位置。您只能选择存储类:自动、静态或线程本地。语言实现选择地址。
如何将内存地址映射到...以在该内存位置创建结构?
可以在任何内存地址中创建具有动态存储(不是变量)的对象,只要该内存已分配,并且不包含非平凡对象。可以使用placement new 表达式或一些在内部执行placement new 的标准函数来实现。
标准 C++ 无法从任意地址分配内存。语言实现负责为变量和动态对象分配内存。
在没有虚拟内存的嵌入式系统上,语言实现可能会记录分配的特定内存地址范围。在这种情况下,您可以简单地使用placement new 在该内存中创建对象。使用此类地址将无法移植到其他系统。
非标准方式怎么样?是的,它可能存在。例如,POSIX 标准指定mmap
函数:
pa=mmap(addr, len, prot, flags, fildes, off);
该参数
flags
提供有关处理映射数据的其他信息。flags 的值是这些选项的按位或,在 <sys/mman.h> 中定义:Symbolic Constant Description MAP_SHARED Changes are shared. MAP_PRIVATE Changes are private. MAP_FIXED Interpret addr exactly.
当
MAP_FIXED
在 flags 参数中设置时,实现会被告知 pa 的值应该是addr
。
但是,请考虑以下 Linux 联机帮助页:
唯一安全的用途是之前使用另一个映射保留了
MAP_FIXED
由addr
和长度指定的地址范围;否则,使用MAP_FIXED
是危险的,因为它强制删除预先存在的映射,使多线程进程很容易破坏自己的地址空间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句