一段C代码运行时_出现内存不能为read的现象_求大神分析,该如何处理

一段C代码运行时_出现内存不能为read的现象_求大神分析
IplImage *getGray(const IplImage *img)
//img的宽高参数为800*600
{
IplImage *gray=(IplImage *)malloc(sizeof(IplImage *));
IplImage *gray32=gray;
gray32=(IplImage *)img;

        int i=0,j=0;
        int c=0;
int width=gray32->width;
int heigh=gray32->height;
int step=gray32->widthStep;
int nchan=gray32->nChannels;
float *data=(float*)gray32->imageData;

for (i=0;i<heigh;i++)
{
for (j=0;j<width;j++)
{
if(nchan==3)
data[i*step+j]=(data[i*step+j*nchan]+data [i*step+j*nchan+1]+data[i*step+j*nchan+2])/765.0;
else
{
data[i*step+j]=(data[i*step+j])/255.0f;
printf("i=%d,j=%d,c=%d\n",i,j,c++);
//在这里打印出来的结果是i=153,j=395,c=122795时,出现内存不能为read
}
}
}
free(gray);
return gray32;
}


求大神给分析分析啊;
ps:没有使用CvCreateImage和CvReleaseImage,想自己编写一个。

------解决方案--------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

------解决方案--------------------
malloc那里分配的大小不对吧,你那样是分配一个指针的大小,而不是IplImage 类型的大小
------解决方案--------------------
IplImage *gray=(IplImage *)malloc(sizeof(IplImage *));    
IplImage *gray32=gray;    
gray32=(IplImage *)img;
这里,你malloc有啥用?

修改1方案:
IplImage *gray=(IplImage *)malloc(sizeof(IplImage)); 
memcpy(gray,img,sizeof(IplImage));
//还有你return一个IplImage *指针,那么你就别free了,free了你return有啥用?

第二个:
就用new,看IplImage类,有重载=运算符不,直接=过来....
------解决方案--------------------
有个地方我说错了
“其次,你分配内存的时候,应该以nSize(应该用这个结构体的大小)去分配内存。用sizeof(IplImage)前提是,该结构体是定长.”

都可以用sizeof(IplImage)的

但是使用IplImage结构体里面的成员变量imageData时,你得看imageSize大小,不能越界.

你程序出错,应该就是越界了一段C代码运行时_出现内存不能为read的现象_求大神分析,该如何处理
------解决方案--------------------
建议这样改一下试试:

IplImage *getGray(const IplImage *img)
//img的宽高参数为800*600
{
    IplImage *gray=(IplImage *)malloc(sizeof(IplImage));
    IplImage *gray32=img;
 
        int i=0,j=0;
        int c=0;
    int width=gray32->width;
    int heigh=gray32->height;
    int step=gray32->widthStep;
    int nchan=gray32->nChannels;
    float *data=(float*)malloc(sizeof(float)*width*height*step);
    gray->imageData = (char*)data;
    char* data1 = img->imageData;
     
    for (i=0;i<heigh;i++)
    {
        for (j=0;j<width;j++)
        {
            if(nchan==3)
                data[i*step+j]=((float)data1[i*step+j*nchan]+data1 [i*step+j*nchan+1]+data1[i*step+j*nchan+2])/765.0;
            else
            {
                data[i*step+j]=(float)data1[i*step+j]/255.0f;
                printf("i=%d,j=%d,c=%d\n",i,j,c++);
            }
        }
    }
    return gray; //返回后的imageData中是float格式的数据,使用时要注意。
}