opencv1.exe 中的 0x00e91bb3 处有未经处理的错误: 0xC0000005: 写入位置 0xcdcdcdcd 时发生访问冲突

opencv1.exe 中的 0x00e91bb3 处有未经处理的异常: 0xC0000005: 写入位置 0xcdcdcdcd 时发生访问冲突
我的问题就是用opencv读取一幅图像32×32的 获取灰度值的时候报错了 是写入位置发生冲突 我用debug一步一步跟的 我是按行按列做循环 直到最后一个值该跳出的时候报这个错误 所以有没有可能是我内存不够?求教各位大神帮解决


int** readImg(char* imagename) {

Mat img = imread(imagename);
int channels = img.channels();

img_row = img.rows;
img_col = img.cols;

//如果读入图像失败
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);

exit;
}

int **matrix = NULL; //定义二维指针数组
matrix = new int *[img_row]; //new出m个空间,里面存的都是地址

for(int i = 0; i < img_row-1; i++) {  //做循环分配出m×n个空间
matrix[i] = new int[img_col];
}

switch(channels){
case 1:
cout << "channels = " << channels << "  ==> ";
for (int col = 0; col < img_col; col++)
{
for (int row = 0; row < img_row; row++)
{
matrix[row][col] = (int)(*(img.data + img.step[0] * row + img.step[1] * col));
//cout << (int)(*(img.data + img.step[0] * row + img.step[1] * col)) << "  ==> ";
//获取第[row,col]个像素点的地址并用 * 符号解析
//*(img.data + img.step[0] * row + img.step[1] * col) = 255;

cout << (int)(*(img.data + img.step[0] * row + img.step[1] * col)) << endl;
}
}
case 3:
for (int row = 0; row < img.rows; row++)
{
for (int col = 0; col < img.cols; col++)
{    

matrix[row][col] = 1/3 * (img.at<Vec3b>(row, col)[0] + img.at<Vec3b>(row, col)[1] + img.at<Vec3b>(row, col)[2]);
/* 注意 Mat::at 函数是个模板函数, 需要指明参数类型, 因为这张图是具有红蓝绿三通道的图,
   所以它的参数类型可以传递一个 Vec3b, 这是一个存放 3 个 uchar 数据的 Vec(向量). 这里
   提供了索引重载, [2]表示的是返回第三个通道, 在这里是 Red 通道, 第一个通道(Blue)用[0]返回 */
//if(img.at<Vec3b>(row, col)[2] > 128)
//img.at<Vec3b>(row, col) = Vec3b(255, 255, 255);
}
 }
}

//显示图像,在哪个个窗口显示
imshow("image", img);  //void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE)//用来创建窗口的函数
//此函数等待按键,按键盘任意键就返回
waitKey();

return matrix;
}
------解决思路----------------------
for(int i = 0; i < img_row/*这里不应该减一吧-1*/; i++) {  //做循环分配出m×n个空间