这是一段代码。 当N = 70000或更多时,代码进入STEP1并与Segmentation Fault崩溃。 相反,如果我把... N = 50000,calloc返回NULL,程序退出返回2。 那么为什么N = 70000 calloc不抱怨? 我用gcc和icc编译了这个。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main(){
float *matrix1,*q,*matrix2;
int i,j,n,N=70000;
n = N+1;
if( (q=calloc(n,sizeof*q)) == NULL ) return 1;
if( (matrix1=calloc(n*n,sizeof*matrix1)) == NULL ) return 2;
if( (matrix2=calloc(N*N,sizeof*matrix2)) == NULL ) return 3;
//STEP1
for(i=0;i<N;i++){
for(j=0;j<N;j++){
matrix2[i*N+j] = i*N+j;
}
}
//STEP2
for(i=0;i<N;i++){ // raw
for(j=0;j<=i;j++){ // column
if(i==j){ matrix1[i+j*n] = 0; } //diagonal elements
else {
matrix1[i+j*n] = i+j*n;
matrix1[j+i*n] = j+i*n;
}
}
}
return 0;
}
答案 0 :(得分:4)
您超出了某些变量的允许值范围。
你有int N=70000
。 N*N
也会给你一个int,它会溢出并获得605032704,这个值可以在你的系统中完美地分配。
您应该使用size_t
来呼叫calloc()
。在这种情况下,即使你有64位,它对你的系统也可能足够大。
当然,即使size_t
可能会溢出,并且,根据您的系统,可能会很早。所以在分配时你应该注意不要超过SIZE_MAX
。