2014-07-09 72 views
1

我正在写一个程序,我必须在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为阵列的索引。因此,这似乎是一个危险的手段,不初始化您的阵列

+0

堆栈在RAM中也不是吗? – 101010

+0

是的。你在暗示什么? –

+0

您是否尝试过以某种方式使用数组,例如显示第一项。 –

回答

5

当您尝试以您没有权限的方式访问内存时,会导致分段错误。没有数组初始值设定项,就没有访问发生。 *

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


*或者,编译器可能只是选择优化这些变量。

+2

“如果没有数组初始值设定项,则不会发生访问。”这有点误导。一个* unused *变量可以被优化掉。这似乎是没有初始化器的情况。 –

+0

@ Cheersandhth.-Alf:我认为这不一定与优化有关。编译器仍然可以移动堆栈指针(或其他)来解释这些变量,但是没有任何内容被写入该内存。 –

+0

那么如果堆栈指针被移位,那么在这些声明之后调用任何例程应该会发生段错误。那么,它本身还不是访问权限(因为那时没有访问权限)。 –