C中允许的最大静态数组大小是多少?

时间:2013-02-07 14:06:21

标签: c arrays stack max

在我的算法中,我知道使用静态数组,没有动态数组。但我有时候 达到堆栈的极限。我是对的,静态数组是否存储到堆栈中?

哪个参数会影响一个C程序的最大堆栈大小?

是否有许多影响最大阵列大小的系统参数?最大化没有。元素取决于数组类型?它取决于系统总RAM吗?或者每个C程序都有一个静态的最大堆栈大小?

3 个答案:

答案 0 :(得分:8)

  

我是对的,静态数组存储在堆栈中吗?

不,static数组存储在静态存储区域中。 自动(即在函数内声明的,没有static存储说明符)在堆栈上分配。

  

哪个参数会影响一个C程序的最大堆栈大小?

这与系统有关。在某些操作系统上you can change stack size programmatically

由于自动存储分配而耗尽堆栈空间是一个明确的迹象,您需要重新考虑您的内存策略:如果重新入侵不是问题,您应该在静态存储区域中分配缓冲区,或者使用动态分配对于最大的阵列。

答案 1 :(得分:1)

实际上,它取决于您使用的平台的C编译器。

例如,甚至有一些系统没有真正的堆栈,因此递归不起作用。

静态数组被编译为带指针的连续内存区域。指针的大小可能是两个或四个字节(或者甚至在异国平台上只有一个)。

有些平台使用具有“近”和“远”指针的存储页面,这些指针的大小(当然还有速度)不同。因此,表示数组和对象的指针需要适合同一个内存页面。

在嵌入式系统上,静态数据通常收集在内存区域中,稍后将由只读内存表示。所以你的阵列必须适合那里。

在运行任意应用程序的平台上,如果上述情况都不适用,则RAM是限制因素。

答案 2 :(得分:0)

你的大多数问题都得到了回答,但只是给出一个让我的生活更轻松的答案:

定性非动态分配数组的最大大小取决于您拥有的RAM量。它还取决于阵列的类型,例如int可能是4个字节,而double可能是8个字节(它们也是系统相关的),因此如果使用int代替,您将能够拥有一个元素数量加倍的数组double

话虽如此,请记住,有时数字确实很重要,这里有一个非常新的代码片段,可以帮助您提取系统中的最大数字。

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

#define UPPER_LIMIT 10000000000000 // a very big number

int main (int argc, const char * argv[])
{
    long int_size = sizeof(int);
    for (int i = 1; i < UPPER_LIMIT; i++)
    {
        int c[i];
        for (int j = 0; j < i; j++)
        {
            c[j] = j;
        }
        printf("You can set the array size at %d, which means %ld bytes. \n", c[i-1], int_size*c[i-1]);
    }    
}

PS:可能需要一段时间才能达到系统的最大值并产生预期的分段错误,因此您可能希望将i的初始值更改为更接近系统RAM的值,以字节为单位表示。