c++ 很隐蔽的指针访问越界的情况---在强制类型转换中发生

template <typename T>
void Mat<T>::Read(char *ImageName) //从硬盘文件中读入图像数据;
{
	IplImage *img =cvLoadImage( ImageName , 0); 
	T *img_data = (T *)(img->imageData);  //原因在这里!
	int width_step=img->widthStep;
	width=img->width;
	height=img->height;
	data=new T *[height];
        for(int i=0;i<height;i++)
        {
           data[i]=new T [width];
        }
	for(int i=0;i<height;i++)
	{
		for(int j=0;j<width;j++)
		{
			data[i][j]=img_data[width_step*i+j];//提示访问越界(此时i=266,j=467 图片的高度为480,宽度512)
		}

	}
	cvReleaseImage( &img );
}

此函数是模版类的成员函数(在类外定义时,写成模板函数),此模版函数在实例化时模板类型T被实例化为double,运行时提示访问越界(如上),其原因是: 由Iplimage 结构体的定义知 对imgData存储的是char类型, 如果强制转换成T类型(此处为double类型),将导致寻址方式改变(指针移动到下一位所越过的字节数变多了),所以导致了访问了越界的内存!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值