2014-07-24 82 views
1

我正在使用Windows XP。所以我明白自动变量存储在堆栈中,并且指针变量的动态生成数据存储在堆中。故障安全分配

堆栈内存和堆内存的数量是否可用于每个已修复的程序。它可以设置为特定的程序不同?如果是,那么 - >该设置是否由系统自动完成,还是必须以某种方式手动完成?

我打算创建一个巨大的数组(50000个说记录)的C.我只能认为它声明为下列之一的结构:

  1. 全局和静态创建如。结构产品[50000];
  2. 本地和动态创建例如。结构产品*产品; products = malloc(sizeof(struct Product)* 50000);

我只知道:

  • 调用了过多的功能(递归或纯一个在另一个)最多可以使用可用的堆栈存储器。
  • Malloc可能会失败,意味着没有足够的堆内存。

对不起,对吗?

这种情况是应用程序将与系统上的许多其他应用程序一起打开。我不希望此应用程序因内存不足而崩溃。那么有什么故障安全的方法有一个巨大的阵列,并吃它

回答

3

动态分配根据需要从操作系统获取(虚拟)RAM。

您可以通过/ F编译器开关控制最大堆栈大小。

+0

从你所说的我得到,如果我要绘制一个SET图,那么堆栈内存将在进程内存(进而是系统内存的一个子集)内。堆内存呢?它是来自进程内存区域内部还是外部? – Jazz

+0

每个malloc(或其他动态分配)都会尝试在可用堆中查找块,如果没有,它会向操作系统请求更多内存。 该块成为您的工艺内存的一部分。 – Jakub

2

50000结构不是大。分配它们不会有任何问题。 对于这个任务,使用动态分配:

struct Product *products = malloc(sizeof(struct Product)*50000); 

这样它会更容易让你访问你的数据,你有一个指针,所以你可以通过它,只要你想要的。此外malloc在分配失败时返回NULL,因此您处理分配错误。

虽然你的RAM是有限的,你不使用任何内存来进行动态分配。 对于静态声明,通常不会失败,但您的计算机又有一些物理限制。 但你不打算接触他们。

+0

假设一个更大的数组。达到限制时会发生什么?程序会崩溃吗?虚拟内存是否可以做任何事情来帮助这里? – Jazz

+1

Malloc将返回一个空指针,自动分配会产生堆栈溢出(不要与本网站混淆)。 – Jakub