Memory management 数组如何存储在内存中?

Memory management 数组如何存储在内存中?,memory-management,Memory Management,为了深入研究内存是如何分配和存储的,我编写了一个应用程序,可以扫描内存地址空间,找到一个值,然后写出一个新值 我开发了一个示例应用程序,最终目标是能够通过编程定位我的数组,并用新的数字序列覆盖它。在这种情况下,我创建了一个一维数组,包含5个元素,例如 int[] array = new int[] {8,7,6,5,4}; 我运行我的应用程序,搜索上面五个数字的序列。我在寻找任何介于4和8之间的值,一行中总共有5个数字。不幸的是,我在数组中的序列号匹配了数百个结果,因为在很多情况下,在内存中,

为了深入研究内存是如何分配和存储的,我编写了一个应用程序,可以扫描内存地址空间,找到一个值,然后写出一个新值

我开发了一个示例应用程序,最终目标是能够通过编程定位我的数组,并用新的数字序列覆盖它。在这种情况下,我创建了一个一维数组,包含5个元素,例如

int[] array = new int[] {8,7,6,5,4};
我运行我的应用程序,搜索上面五个数字的序列。我在寻找任何介于4和8之间的值,一行中总共有5个数字。不幸的是,我在数组中的序列号匹配了数百个结果,因为在很多情况下,在内存中,从4到8的数字没有一个特定的序列碰巧彼此相邻

有没有办法区分内存中的一组数字代表一个数组,而不仅仅是相邻的整数?有没有办法知道,如果我找到某个值,匹配的值就是数组的值

我假设当我声明
int[]array
时,它指向数组的第一个地址,这将为数组中存在的内容提供某种元数据,例如


我离基地太远了吗?

不要。数组存储在堆上,并由于垃圾收集而被重新定位。如果你需要确保内存没有被移动,你必须使用它,你可以使用它,但必须非常小心


如果您想要高性能阵列,请使用并使用您的代码方案。

内存并不总是连续存储的。如果你能确保它是,你所问的是可能的。

我不知道确切的情况,但似乎建议你可以得到一个指向数组的指针,我认为你可以用它来确定实际地址。

虽然我看到你在使用C#和,.NET,但你的大多数问题都是关于内存的。请记住,在最一般的意义上,所有内存都只是位,无论该内存包含数组、字符串还是代码

记住这一点,除非您能找到当前平台分配不同数据类型方式的信号,否则包含数组、字符串或代码的内存之间没有区别


此外,我不会对数组是否“指向”数组中的第一项做出任何假设。也许其他人可以专门解决这个问题,但我假设其中涉及某种头。

Debug+Windows+Memory+Memory 1,将地址字段设置为“array”。当您将视图切换到“4字节整数”时,您将看到:

第一个地址是垃圾收集堆中对象的地址,加上位于负偏移量(syncblk索引)的对象头部分。您无法猜测该值,GC会将其移动。第二个十六进制数是数组类型的“类型句柄”(也称为方法表指针)。您无法猜测此值,类型句柄是由CLR根据需要创建的。第三个数字是数组长度。其余的是数组元素值


在没有调试器的情况下,在运行时可靠地找到此数组的几率非常低。尝试没有多大意义。

int[]数组=新数组{8,7,6,5,4}?除了了解声明时如何存储上述示例之外,我不打算在这里讨论任何内容。在GC过程中对数组发生的任何事情都超出了我要问的范围。只是想接受教育。:)同意。我删除了C#标记。在这种情况下,我会说您的问题的答案是否。数组在虚拟内存中连续存储。连续虚拟内存并不意味着连续物理内存,但如果这个“扫描程序应用程序”使用的是物理地址,我会非常惊讶。如果使用硬件DMA引擎扫描内存,您只需担心这样的细节。如果第三组数字表示数组的长度,并且在它与已知数字和长度的目标范围匹配之后,继续进行的数字-我可以看到这已经非常接近了。例如,如果我要搜索000000FF,知道我有一个长度为255的数组,然后在数组中测试255个数字的范围,例如0-5,那么在代码的其他地方找到精确组合的可能性似乎很小。然而,我声明的数组越小,匹配它的可能性就越小。是的。地址是4的倍数。歧义是个问题,你没有任何东西可以选择“合适的”一个。最多可搜索20亿字节。ValualQuQuy可以把它砍掉,只考虑读+写页面。用我提到的第三个数字集和我定义的几个其他抽象搜索规则修改我的应用程序,以便通过进程地址空间快速、准确地枚举。在一瞬间找到了我的阵列,并且只找到了我的阵列。非常感谢!
0x123456789 meta-data, 5 - 32 bit integers 
0x123456789 + 32 "8"
0x123456789 + 64 "7"
0x123456789 + 96 "6"
0x123456789 + 128 "5"
0x123456789 + 160 "4"
0x018416BC  6feb2c84 00000005 00000008 00000007 00000006 00000005 00000004