局部变量(大型数组)的初始化如何影响堆栈大小?

时间:2014-07-09 22:57:37

标签: c++ arrays debugging segmentation-fault

我正在编写一个程序,我可以在4GB RAM机器上制作几个10 ^ 6顺序的大整数数组。虽然我选择使用malloc 在堆上分配内存。但是,在静态定义数组时,当阵列初始化时,我很明显地会出现明显的预期分段错误,而不是在我不初始化这些数组时。

#define LIMIT 1000000
#define MOD 1000000007

using namespace std;



void prime_seive(vector<int> &primes)
{
    int i, j;
    bool prime_no[LIMIT+1];
    int m=sqrt(LIMIT);
    // Something else

}

int main()
{
    vector<int> primes;
    prime_seive(primes);

    int t;
    scanf("%d", &t);    
    while(t--)
    {
        int n;
        scanf("%d", &n);

        int a[n+1];
        for(int i=1;i<n+1;i++)
        {
            scanf("%d",&a[i]);
        }

        int fact_arr[LIMIT+1]={0};  // Segmentation fault when I initialize arrays
        int part_arr[LIMIT+1]={0};  // Segmentation fault when I initialize arrays
    }   
    return 0;   
}

但没有初始化

int fact_arr[LIMIT+1];  // NO Segmentation fault here.
int part_arr[LIMIT+1];  // NO Segmentation fault here.

我没有遇到任何类型的细分错误。

出于好奇,我想了解初始化阵列的不同之处是什么?

编辑1: 好的,所以我在末尾添加了cout<<fact_arr[0]<<fact_arr[1]<<endl;,并为数组的那些索引打印了00。因此,这似乎是一种不初始化数组的危险手段

1 个答案:

答案 0 :(得分:5)

当您尝试以您未获得许可的方式访问内存时,会导致分段错误。如果没有数组初始化程序,则不会进行访问。 *

但是,该代码仍然很陡峭。例如,如果您之后立即调用函数,导致堆栈访问。

<小时/> *或者,编译器可能只是选择优化那些变量。