c++ - 为什么我们不能在内存限制内声明一个任意大小的数组,比如 int 数据类型?

标签 c++ c arrays memory-management

int A[10000000]; //This gives a segmentation fault
int *A = (int*)malloc(10000000*sizeof(int));//goes without any set fault.

现在我的问题是,出于好奇,如果最终我们能够为我们的数据结构分配更高的空间,例如,使用 C 中的指针方法创建的 BST 和链表没有这样的内存限制(除非总大小超过我们机器的 RAM 大小),例如,在上面声明指针类型的第二个语句中,为什么我们不能声明更大大小的数组(直到它达到内存限制! !)...这是因为分配的空间在静态大小的数组中是连续的吗?但是我们从哪里得到保证,在 RAM 中的下一个 1000000 字中,没有其他代码将运行...??

PS:我的某些陈述可能是错误的......请在这种情况下更正。

最佳答案

首先,在具有虚拟内存的典型现代操作系统(Linux、Windows 等)中,RAM 的数量没有任何区别。您的程序正在使用虚拟内存,而不是 RAM。 RAM 只是用于虚拟内存访问的缓存。最大数组大小的绝对限制因素不是 RAM,而是可用地址空间的大小。地址空间是您在具有虚拟内存的操作系统中必须担心的资源。在 32 位操作系统中,您有 4 GB 的地址空间,其中一部分用于各种家庭需求,其余的供您使用。在 64 位操作系统中,理论上您有 16 EB 的地址空间(比实际实现中的要少,因为 CPU 通常使用少于 64 位来表示地址),这实际上可以被视为无限。

其次,典型 C/C++ 实现中的可用地址空间量取决于内存类型。有静态内存,有自动内存,有动态内存。每种内存类型的地址空间限制由编译器预先设置。这就提出了一个问题:你在哪里声明你的大数组?哪种内存类型?自动的?静止的?您没有提供任何信息,但这是绝对必要的。如果您试图将其声明为局部变量(自动内存),那么难怪它不起作用,因为自动内存(又称“堆栈内存”)分配给它的地址空间非常有限。您的阵列根本不适合。同时,malloc 分配动态内存,通常拥有最大的可用地址空间。

第三,许多编译器为您提供了控制不同类型内存之间地址空间初始分配的选项。您可以通过操作这些选项为您的程序请求更大的堆栈大小。很可能您可以请求一个如此大的堆栈,以至于您的本地数组可以毫无问题地放入其中。但在实践中,出于显而易见的原因,将大数组声明为局部变量几乎没有意义。

关于c++ - 为什么我们不能在内存限制内声明一个任意大小的数组,比如 int 数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127705/

相关文章:

c++ - 在遍历 vector 时从 vector 中删除对象

c - 传递 strcpy 的参数 2 使指针来自整数而不进行强制转换

c - 4096 个 float 和 2 个选项哪个是最好的方法,为什么?

php - 如何在smarty中打印数组?

c++ - 尝试执行 gcc 错误 'cc1' : execvp: No such file or directory when running with non-root user

c++ - 在 void C/C++ 例程末尾添加 return 语句有什么意义?

java - c++中具有相同名称的局部变量和形式参数?

带有字符串的 C 结构数组 - 操作/访问

arrays - 科学/ NumPy : summation over multiple indices

java - 对数组进行排序并保留原始索引