Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 故障保护分配_C_Memory - Fatal编程技术网

C 故障保护分配

C 故障保护分配,c,memory,C,Memory,我正在使用windows XP。所以我知道自动变量存储在堆栈上,指针变量的动态生成数据存储在堆上 每个程序可用的堆栈内存和堆内存量是固定的。是否可以为特定程序设置不同的设置?如果是,则->设置是由系统自动完成的,还是必须以某种方式手动完成 我计划用C语言创建一个巨大的结构数组(比如50000条记录)。我只能考虑将其声明为以下内容之一: 全局和静态创建,例如结构产品[50000] 本地和动态创建,例如结构产品*产品;产品=malloc(结构产品的尺寸)*50000) 我只知道: 调用太多的函数(

我正在使用windows XP。所以我知道自动变量存储在堆栈上,指针变量的动态生成数据存储在堆上

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

我计划用C语言创建一个巨大的结构数组(比如50000条记录)。我只能考虑将其声明为以下内容之一:

  • 全局和静态创建,例如结构产品[50000]
  • 本地和动态创建,例如结构产品*产品;产品=malloc(结构产品的尺寸)*50000) 我只知道:

    • 调用太多的函数(递归函数或普通函数)可能会耗尽可用的堆栈内存
    • Malloc可能会失败,这意味着没有足够的堆内存可用
    我说得对吗

    这种情况下,应用程序将与系统上的许多其他应用程序一起打开。我不希望这个应用程序因为内存不足而崩溃。那么,拥有一个庞大的阵列并吃掉它的故障保护方法是什么呢?

    50000个结构并没有那么大。分配它们不会有任何问题。 对于此任务,请使用动态分配:

    struct Product *products = malloc(sizeof(struct Product)*50000);
    
    通过这种方式,您可以更轻松地访问数据,因为您有一个指向它的指针,所以您可以随时传递它。此外,
    malloc
    在分配失败时返回NULL,因此您可以处理分配错误

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

    50000个建筑没那么大。分配它们不会有任何问题。 对于此任务,请使用动态分配:

    struct Product *products = malloc(sizeof(struct Product)*50000);
    
    通过这种方式,您可以更轻松地访问数据,因为您有一个指向它的指针,所以您可以随时传递它。此外,
    malloc
    在分配失败时返回NULL,因此您可以处理分配错误

    虽然您的RAM是有限的,但您不使用任何内存来进行动态分配。 对于静态声明,它通常不会失败,但您的计算机也有一些物理限制。 但是您无法访问它们。

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

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

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


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

    假设数组较大。当达到极限时会发生什么?程序会崩溃吗?虚拟内存对此有帮助吗?Malloc将返回一个空指针,自动分配将产生堆栈溢出(不要与此网站混淆)。假设一个更大的数组。当达到极限时会发生什么?程序会崩溃吗?虚拟内存对此有帮助吗?Malloc将返回一个空指针,自动分配将生成堆栈溢出(不要与此网站混淆)。根据您所说,如果我绘制一个集合图,那么堆栈内存将位于进程内存中(这又是系统内存的一个子集)。堆内存呢?它是在进程内存区域的内部还是外部?每个malloc(或其他动态分配)都试图在可用堆中找到一个块,如果没有,它会请求操作系统提供更多内存。这个块成为进程内存的一部分。从你说的我得到,如果我画一个集合图,那么堆栈内存将在进程内存中(这反过来又是系统内存的一个子集)。堆内存呢?它是在进程内存区域的内部还是外部?每个malloc(或其他动态分配)都试图在可用堆中找到一个块,如果没有,它会请求操作系统提供更多内存。此块将成为进程内存的一部分。