gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:24 27 4
gpt4 key购买 nike

这是一段代码。N=70000 或更多时,代码会继续执行 STEP1 并因段错误而崩溃。相反,如果我把例如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;
}

最佳答案

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

您有 int N=70000N*N 也会为您提供一个 int,它会溢出并得到 605032704,这个值可以完美地分配到您的系统上。

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

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

关于calloc 初始化了比可用内存更多的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25546095/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com