用malloc函数开辟二维数组的有关问题

用malloc函数开辟二维数组的问题
为什么block1可以正常执行但是block2会出现内存错误,想了很久没有明白,求解答

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void** malloc2d(int rows, int cols, int size)
{
  printf("%d\t%d\t%d\n",rows,cols,size);
  int j;
  int rowSize = cols * size;
  int indexSize = rows * sizeof(void *);
  void **a = (void **) malloc(indexSize + rows* rowSize);
  char *dataStart = (char *) a + indexSize;
  for(j = 0; j < rows; j++){
   printf("%d\n",j);
    a[j] = dataStart + j * rowSize;
  }
  return a;
}

int main(){
int i,rows,cols,row,col;
rows = cols = 40400;
row = 3;col = 2;
int** block1 = (int**)malloc2d(row,col,sizeof(int));
printf("end of block1,begin of block2\n");
int** block2 = (int**)malloc2d(rows,cols,sizeof(int));
free(block1);
free(block2);
return 0;
}


------解决思路----------------------
恐怕你分配的内存大小已经超出了一个进程用户可用内存的大小了
------解决思路----------------------
malloc(indexSize + rows* rowSize);
40400 * 4 + 40400 * 4 * 40400 //这得有多大, 哪里有这么多内存让你申请和释放
------解决思路----------------------
用文件读写模拟内存读写。参考_lseeki64函数。