作者: 
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;
}
作者: 
poyenc (髮箍)   
2018-12-04 22:46:00pData 的初始化也有問題, 只是指標大小相同所以算出來位址剛好是對的簡單說以一個整數 c 來說, array + c 代表的涵義是從array指向的位置開始, 往後算 c 個 sizeof(*array) 物件之後的位址, 這裡的 sizeof(*array) == sizeof(double**), 表示array + c 實際上是在預留 c 個 double** 的空間, 這部分沒問題; 但在初始化 pData 的時候你用的方法卻是和 ppData一樣, 多預留 l*m 個 double** 空間給 double* 用