我正在编写一个程序,我可以在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 :(得分:5)
当您尝试以您未获得许可的方式访问内存时,会导致分段错误。如果没有数组初始化程序,则不会进行访问。 *
但是,该代码仍然很陡峭。例如,如果您之后立即调用函数,将导致堆栈访问。
<小时/> *或者,编译器可能只是选择优化那些变量。