VS2013下动态数组二维数组读二进制文件的问题

int samples_to_read = 7200;
    uint8_t **caculate_a;
    int count2,count3;
    caculate_a = (uint8_t **)malloc(sizeof(uint8_t *)* 3);
    for (count1 = 0; count1<3; count1++){    //动态数组分配空间
        caculate_a[count1] = (uint8_t *)malloc(sizeof(uint8_t)*samples_to_read);
    }
    for (count2 = 0; count2 < 3; count2++){
        for (count3 = 0; count3 < samples_to_read; count3++){
            fread(&(caculate_a[count3][count2]), sizeof(uint8_t), 3 * samples_to_read, fp);     //疑问位置
            printf("%d ", &caculate_a[count2][count3]);
        }
    }

    for (count1 = 0; count1 < 3; count1++){    //释放
        free(caculate_a[count1]);
    }
    free(caculate_a);
}

这段代码,在运行fread的时候需要元素需要

fread(&(caculate_a[count3][count2]), sizeof(uint8_t), 3 * samples_to_read, fp);
且读出(打印)caculate[count2][count3]才能打印得到正确的数据,但读入6个数据之后在输出栏内提示

Critical error detected c0000374

再按F10进行单步调试则得到堆栈损坏的提示如下:
图片说明
2.使用合乎逻辑的读入方法(对应元素):

fread(&(caculate_a[count2][count3]), sizeof(uint8_t), 3 * samples_to_read, fp);
则可顺利完成3*7200信息的录入,但数据仅第一个为正确的.

后采取长度为21600的一维数组进行验证,结果也与二维数组fread第二种结果相同,即无法得到正确数据;

第一次在这提问,求指点

caculate_a[count3][count2]
你这个数组下标用反了吧,是caculate_a[count2][count3]吧

说错了,从你这代码看,应该不需要双重循环啊。
for (count2 = 0; count2 < 3; count2++){
fread(&(caculate_a[count2]), sizeof(uint8_t), 3 * samples_to_read, fp);

就可以了吧

仔细读了一遍,发现是我对fread的理解有偏差

 size_t fread( void *buffer, size_t size, size_t count,FILE *stream );

格式如上,第三个元素是读入的数据字节数,在我的程序中应该将它设为1(循环了3* samples_to_read次),就可以得到结果了(如下)

 fread(&(caculate_a[count2][count3]), sizeof(uint8_t), 3 sizeof(uint8_t), fp);