2014-08-28 77 views
1

这是一段代码。 当N = 70000或更多时,代码进入步骤1并使用分段错误崩溃。相反,如果我把例如N = 50000,calloc返回NULL,程序退出返回2. 那么为什么N = 70000 calloc不会抱怨呢? 我用gcc和icc编译了这个。calloc初始化比可用内存更多的内存

#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; 
} 
+3

由于int不能存储这么大的值,所以对于i,j和N绝对使用long int。 – Igor 2014-08-28 10:09:05

+1

@Igor更好:'size_t'。 – glglgl 2014-08-28 10:21:08

回答

4

您超出了某些变量的允许值范围。

您有int N=70000。 A N*N也为您提供了一个int,它会溢出并获取6050​​32704,而这个值可以在您的系统上完美分配。

您应该使用size_t拨打calloc()。在这种情况下,即使您有64位,它也可能足够大。

当然,即使size_t可能会溢出,并且根据您的系统,可能会很早。所以在分配时应注意不要超过SIZE_MAX

+0

@MattMcNabb对,补充说。 – glglgl 2014-08-28 10:20:26

+0

非常感谢您的回答。如果我的系统有256 GB的RAM,并且我希望全部使用它们,我怎样才能调用'calloc()'来分配这样的数组? – cipper 2014-08-28 11:04:33

+0

忘记它,通过使用size_t它工作得很好!谢谢! – cipper 2014-08-28 11:33:46