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

Posted

技术标签:

【中文标题】C 中允许的静态数组的最大大小是多少?【英文标题】:What maximum size of static arrays are allowed in C? 【发布时间】:2013-01-23 01:34:51 【问题描述】:

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

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

是否有很多系统参数会影响最大数组大小?最大没有。元素的数量取决于数组类型?它是否取决于总系统 RAM?还是每个 C 程序都有一个静态的最大堆栈大小?

【问题讨论】:

“静态数组”是什么意思?函数中的局部变量,包括数组,都存储在堆栈中。 我认为您可以告诉 链接器 您希望堆栈有多大,但我不确定在创建线程时它是如何工作的。不过,在台式机上大约是一兆字节。 另外,正如 Joachim 所说,“静态”并不代表您的想法。静态数组实际上根本不入栈,可以随心所欲。 您使用的是什么系统/架构,linux、OSX、windows、ARM?你能发布一小段代码吗? 静态数组不存储在栈中,而是存储在数据段中 【参考方案1】:

我说得对吗,静态数组存储到堆栈中?

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

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

这取决于系统。在某些操作系统上you can change stack size programmatically。

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

【讨论】:

也可以ulimit -s 增加堆栈大小 @ogzd 增加了多少? 静态区域允许多少存储空间?【参考方案2】:

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

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

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

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

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

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

【讨论】:

【参考方案3】:

您的大部分问题都已得到解答,但只是为了给出一个让我的生活更轻松的答案:

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

话虽如此,但请记住,有时数字确实很重要,这里有一个非常无聊的代码 sn-p 可帮助您提取系统中的最大数字。

#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 的值,以字节表示。

【讨论】:

以上是关于C 中允许的静态数组的最大大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章

php中允许的内存大小为33554432字节耗尽(尝试分配43148176字节)

奇怪的致命错误:作曲家文件中允许的内存大小

如何将文本字段中允许的最大输入值限制为 10? [复制]

php数组键中允许的字符?

增加MySQL中允许的最大u包数

Laravel 的 CheckForMaintenanceMode 中间件中允许的内存大小耗尽