标签: memory-address

指向STL容器元素的指针

给定一个非连续的STL容器(您也可以考虑boost::unordered_mapboost::multi_index_container考虑),如果没有删除任何元素,是否保证容器内元素的内存地址永远不会改变(但是可以添加新的容器)?

例如

class ABC { };
//
//...
//
std::list<ABC> abclist;
ABC abc;
abclist.insert(abc);
ABC * abc_ptr = &(*abclist.begin());
Run Code Online (Sandbox Code Playgroud)

在其他的字将abc_ptr被指出abc在整个执行,如果我不删除abcabc_list.

我问这个是因为我要用ABCC++/Cli ABC包装类,所以我需要指向包装类中的实例的指针.ABC是一个简单的类,我希望容器处理内存.如果答案是否定的话我将使用std::list<ABC*>.

c++ pointers stl memory-address

20
推荐指数
3
解决办法
8490
查看次数

为什么Windows为其系统地址空间保留1Gb(或2 Gb)?

众所周知,Windows应用程序通常在32位系统上具有2Gb的专用地址空间.使用/ 3Gb开关可将此空间扩展至3Gb.

操作系统保留了4Gb的剩余部分.

我的问题是为什么?

在内核模式下运行的代码(即设备驱动程序代码)具有自己的地址空间.为什么在独有的4Gb地址空间之上,操作系统仍然希望保留每个用户模式进程的2Gb?

我认为原因是用户模式和内核模式调用之间的转换.例如,调用NtWriteFile将需要内核调度例程的地址(因此系统为什么在每个应用程序中保留2Gb).但是,使用SYSENTER,是不是系统服务号足以让内核模式代码知道正在调用哪个函数/服务?

如果你能向我澄清为什么操作系统对每个用户模式进程采用2Gb(或1Gb)非常重要.

memory windows virtual virtual-address-space memory-address

19
推荐指数
1
解决办法
4108
查看次数

计算机中的一个内存位置存储了多少数据?

假设32位操作系统.

  1. 计算机中的一个内存位置存储了多少数据?

  2. 什么是计算机中存储器的基本单元?

  3. 例如,对于存储整数,所需的内存地址是多少?如果基本单位是BYTE,则整数需要4个字节.因此,如果我需要存储一个字节,那么如果开始放入内存位置0001的第一个字节,那么我的整数是否会在0003内存位置结束?

如果我错了请纠正我?

我需要有关CPU内存存储和管理的更多信息......能否请您指点一些资源?

memory integer memory-address

19
推荐指数
1
解决办法
2万
查看次数

用python执行汇编程序代码

我想在python脚本中执行汇编代码.那可能吗?

在C编程中会是这样的

static inline getesp(){
        __asm__("mov %esp, %eax");
}
Run Code Online (Sandbox Code Playgroud)

但是如何用Python做到这一点?可能吗?

python assembly pointers memory-address

19
推荐指数
4
解决办法
3万
查看次数

为什么禁止获取(&)map成员的地址,但允许(&)切片元素?

Go不允许获取地图成员的地址:

// if I do this:
p := &mm["abc"]
// Syntax Error - cannot take the address of mm["abc"]
Run Code Online (Sandbox Code Playgroud)

理由是,如果Go允许获取此地址,则当地图反向存储增长或闪烁时,地址可能变得无效,使用户感到困惑.

但是当Go切片的容量超过它时,Go切片会被重新定位,但Go允许我们获取切片元素的地址:

 a := make([]Test, 5)
 a[0] = Test{1, "dsfds"}
 a[1] = Test{2, "sdfd"}
 a[2] = Test{3, "dsf"}

 addr1 := reflect.ValueOf(&a[2]).Pointer()
 fmt.Println("Address of a[2]: ", addr1)

 a = append(a, Test{4, "ssdf"})
 addrx := reflect.ValueOf(&a[2]).Pointer()
 fmt.Println("Address of a[2] After Append:", addrx)

 // Note after append, the first address is invalid
 Address of a[2]:  833358258224
 Address of a[2] After Append: 833358266416
Run Code Online (Sandbox Code Playgroud)

为什么Go设计得像这样?获取切片元素的地址有什么特别之处?

memory pointers go memory-address

19
推荐指数
2
解决办法
5641
查看次数

访问直接内存地址并在C++中获取值

我想知道是否可以使用C/C++访问直接的内存块并获取值.例如:

int i = 15;
int *p = &i;
cout << &i;
Run Code Online (Sandbox Code Playgroud)

如果我在这里取印刷值,那将给我变量i的地址,其中包含值15.我只是说它为本例打印出0x0ff9c1.如果我有一个单独的程序声明一个像这样的指针...

int *p = 0x0ff9c1;
cout << *p;
Run Code Online (Sandbox Code Playgroud)

是否有可能打印出另一个应用程序放在内存块0x0ff9c1中的15?我知道我的指针声明与内存地址不正确,我不知道如何做到这一点.我尝试过使用memcopy但是我也无法使用它.我知道这是可能的,因为我有一个名为Cheat Engine的程序,它修改游戏内存地址值以获得不公平的优势.我已成功放置打印的内存位置并通过Cheat Engine获取值(15).我的目标是使用C++来做到这一点.如果这太混乱了,基本上我想访问另一个应用程序使用其内存地址存储的变量并打印出该值.如果重要的话,我正在使用Windows 7 x64和MinGW编译器.谢谢!

PS:我会张贴一张Cheat Engine的图片,以提供更好的主意. 在此输入图像描述

c++ memory pointers memory-address

16
推荐指数
2
解决办法
2万
查看次数

是否有一个符号代表GNU GAS汇编中的当前地址?

我很想知道是否有任何特殊的GAS语法来实现相同的功能,如在NASM示例中:

SECTION .data       

    msg:    db "Hello World",10,0  ; the 0-terminated string.
    len:    equ $-msg              ; "$" means current address.
Run Code Online (Sandbox Code Playgroud)

特别是我对$代表当前地址的符号感兴趣.

assembly gnu gnu-assembler memory-address

15
推荐指数
3
解决办法
5974
查看次数

使用Golang读取随机内存位置

晚上好,

我一直在尝试构建一个golang应用程序,它扫描内存中的值,但我正在努力了解如何解决特定的内存位置.我知道当访问应用程序中的内存时,您可以使用*variablenamedeference并获取地址位置,但是我如何提供地址位置并将值打印到屏幕或从RAM中获取任何大小的下一个分配对象并打印它的值?

提前感谢您愿意分享的任何帮助

go memory-access memory-address

15
推荐指数
1
解决办法
1810
查看次数

我在C中的(char*)元素数组上有三个循环.为什么第三个失败?

在尝试使用C语言中的字符串数组步进的方法时,我开发了以下小程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef char* string;

int main() {
  char *family1[4] = {"father", "mother", "son", NULL};
  string family2[4] = {"father", "mother", "son", NULL};

  /* Loop #1: Using a simple pointer to step through "family1". */
  for (char **p = family1; *p != NULL; p++) {
    printf("%s\n", *p);
  }
  putchar('\n');

  /* Loop #2: Using the typedef for clarity and stepping through
   * family2. */
  for (string *s = family2; *s != NULL; s++) {
    printf("%s\n", *s);
  } …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers memory-address

15
推荐指数
2
解决办法
1304
查看次数

"char*"具有不寻常的内存字大小(Knuth的MIX架构)

最初的MIX架构具有6位字节,存储器被寻址为31位字(5个字节和一个符号位).作为一个思考练习,我想知道C语言如何在这种环境中发挥作用,给出:

  • char至少有8位(C99规范附件E)
  • C99规范6.3.2.3节("指针")第8段说"当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节.结果连续增加,向上到对象的大小,产生指向对象剩余字节的指针." 我对这个要求的解释是它支持"memcpy(&dst_obj,&src_obj,sizeof(src_obj))".

我能想到的方法:

  1. 使char为31位,因此通过"char*"间接是简单的内存访问.但这会使字符串浪费(并且意味着它不符合POSIX标准,因为它显然需要8位字符)
  2. 将3个8位字符打包成一个字,7个忽略位:"char*"可能由字地址和字符索引组成.然而,这似乎违反了6.3.2.3,即memcpy()必然会跳过忽略的位(这对于真实对象类型可能有意义)
  3. 将字符完全打包成单词,例如第四个8位字符在字0中有7位,在字1中有一位.但是这似乎要求所有对象都是8位字符大小,例如"uint31_t"不能声明匹配单词长度,因为这又有memcpy()问题.

所以这似乎留下了使用31位字符的第一个(浪费)选项,所有对象的大小都是char的倍数 - 我是否正确地阅读它?

c knuth bit memory-address language-lawyer

14
推荐指数
1
解决办法
605
查看次数