[问题] 避免碎片化的动态内存配置方式

楼主: eagle32 (バスケがしたいです)   2018-12-04 15:28:38
大家好. 我对于电脑内存的理解不多. 只是常听说要避免内存碎片化.
所以就学了以下语法要一块连续内存去配制一个阵列. 但是当阵列太大时.
譬如50*50*50 的 double array 执行时就发生segmentaion fault. 请大家指教我哪里做错想错了.
谢谢大家.
#include <stdlib.h>
#include <stdio.h>
int main() {
double ***array;
double **ppData;
double *pData;
int l=50;
int m=50;
int n=50;
int i,j,k;
array = (double ***)calloc(l*m*n, l*sizeof(double **) + l*m*sizeof(double *) +
l*m*n*sizeof(double));
ppData = (double **) (array+l);
pData = (double *) (array+l+l*m);
for(i=0; i < l; i++)
{
array[i]=ppData;
ppData+=m;
for(j=0; j < m; j++)
{
array[i][j]=pData;
pData+=n;
}
}
for(i=0; i<l; i++)
for(j=0; j<m; j++)
for(k=0; k<n; k++)
printf("(%d, %d, %d)=%f\n", i,j,k,array[i][j][k]);
free(array);
return 0;
}
作者: school4303 (某爬虫类)   2018-12-04 15:44:00
calloc用法是不是错了
作者: nh60211as   2018-12-04 15:46:00
http://www.cplusplus.com/reference/cstdlib/calloc/第二个argument是每个元素的大小比较像是内存不够用,回传了NULL POINTER
作者: sarafciel (Cattuz)   2018-12-04 17:10:00
你这个不是50^3,是(50^3)^2 约等于14.5G个element保守点拿32bit机器的4byte指标来算 你要了58G左右咦等等 你最后一个不是指标而是double 那就是116G了XD
楼主: eagle32 (バスケがしたいです)   2018-12-04 21:54:00
的确我错用 calloc 了.导致我要了大约126G的内存
作者: poyenc (发箍)   2018-12-04 22:46:00
pData 的初始化也有问题, 只是指标大小相同所以算出来位址刚好是对的简单说以一个整数 c 来说, array + c 代表的涵义是从array指向的位置开始, 往后算 c 个 sizeof(*array) 物件之后的位址, 这里的 sizeof(*array) == sizeof(double**), 表示array + c 实际上是在预留 c 个 double** 的空间, 这部分没问题; 但在初始化 pData 的时候你用的方法却是和 ppData一样, 多预留 l*m 个 double** 空间给 double* 用
楼主: eagle32 (バスケがしたいです)   2018-12-04 23:08:00
有看过指标指向多维阵列的图解. 不过一下子找不到了像p大说的.我这个部分也理解错了
作者: OhNo386 (OhNo386)   2018-12-08 08:07:00
指标的指标其实很慢,用一维表示二维或多维会快很多

Links booklink

Contact Us: admin [ a t ] ucptt.com