calloc初始化的内存比可用内存多

时间:2014-08-28 10:05:34

标签: c segmentation-fault calloc

这是一段代码。 当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;
}

1 个答案:

答案 0 :(得分:4)

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

你有int N=70000N*N也会给你一个int,它会溢出并获得605032704,这个值可以在你的系统中完美地分配。

您应该使用size_t来呼叫calloc()。在这种情况下,即使你有64位,它对你的系统也可能足够大。

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