user-0 提问: 一段C代码运行时_出现内存不能为read的现象_求大神分析

回复:
user: user-1
content: 自己结构体初始化的时候为什么不试试memcpy呢？ 引用 33 楼 chengkun183 的回复:结贴了：：：  IplImage *getGray(const IplImage *img) { /****************************************************** IplImage *gray=(IplImage *)malloc(sizeof(IplImage *)); IplImage *gray32=gray; gray32=(IplImage *)img; 1.sizeof()使用错误，应该改为sizeof(IplImage ) 	感谢2/4楼的“starytx,拾瓦星哥”指出该错误;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 	感谢7楼的“adeng1919,懒懒的吉他手”给出提醒.>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2.指针指向错误，首先指到分配的内存空间，然后又将指针指向const IplImage *img，并在后面的操作试图修改指针内容     感谢6/9/17/20/21/23/24的“xihu1364,版主大哥”指出错误，并提出解决方案以及告诫。>>> 	感谢10楼的“starytx,拾瓦星哥”描述。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 	感谢30楼的“jianwen0529，jianwen0529”指出该错误。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 	感谢31楼的“terhack，terhack”的提醒。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *******************************************************/ //直接修改为：：： IplImage *gray32=(IplImage *)malloc(sizeof(IplImage));  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; 3.未对结构体成员指针分配内存空间 	感谢25/26/28楼的“bijiaoben，大奶兔白糖”指出该错误，以及提供解决方案。 *******************************************************/ //修改为：：： int width=img->width; int heigh=img->height; int step=img->widthStep; int nchan=img->nChannels; float *data=(float*)gray32->imageData; data=(float *)malloc(sizeof(float)*width*heigh); char * dat=img->imageData;  for (i=0;i<heigh;i++) { 	for (j=0;j<width;j++) 	{ 		if(nchan==3) 			data[i*step+j]=(dat[i*step+j*nchan]+dat[i*step+j*nchan+1]+dat[i*step+j*nchan+2])/765.0; 		else 		{ 			data[i*step+j]=(dat[i*step+j])/255.0f; 		//	printf("i=%d,j=%d,c=%d\n",i,j,c++); 		} 	} } //free(gray) //不再次使用 return gray32; } //这样修改可以保证这段代码可以运行，数据是不完整的， //因此IplImage数据结构内的很多成员参数都需要初始化， //不然得出的结果后面的程序是不能使用的， //只针对这段代码的本身的错误进行修改。 //另外感谢全楼成员的指导和帮助  /***************************警戒线*******以示自己对整个结构，指针的不了解**********************************/ //另外我也修改了一份把IplImage数据结构内的重要成员初始化的代码，后面的程序可以使用 IplImage *getGray(const IplImage *img) { 	IplImage *gray32=0; 	gray32=(IplImage *)malloc(sizeof(*gray32)); 	memset( gray32, 0, sizeof( *gray32 )); 	gray32->nSize=sizeof( *gray32 ); 	gray32->height=img->height; 	gray32->width=img->width; 	gray32->align=4; 	gray32->nChannels = 1; 	gray32->widthStep = 3200; 	gray32->imageSize=gray32->widthStep*gray32->height; 	gray32->origin=0; 	 	int i=0,j=0; 	int height = img->height; 	int width  = img->width; 	int step   = img->widthStep/sizeof(float); 	int nchan  = img->nChannels; 	float * data=(float*)malloc(sizeof(float)*width*height); 	gray32->imageData =(char*) data; 	char * dat = img->imageData;	   	for (i=0;i<height;i++) 		{ 			for (j=0;j<width;j++) 			{ 				if(nchan==3) 					data[i*step+j]=(float)(dat[i*step+j*nchan]+dat[i*step+j*nchan+1]+dat[i*step+j*nchan+2])/765.0f; 				else 					data[i*step+j]=(float)(dat[i*step+j])/255.0f;  			} 			 		}         return gray32; } /*************************************************************************************/

user: user-2
content: 肯定指针指向错误地方了

user: user-3
content: gray32=(IplImage *)img; //这句屏蔽掉看看

user: user-0
content: 结贴了：：：  IplImage *getGray(const IplImage *img) { /****************************************************** IplImage *gray=(IplImage *)malloc(sizeof(IplImage *)); IplImage *gray32=gray; gray32=(IplImage *)img; 1.sizeof()使用错误，应该改为sizeof(IplImage ) 	感谢2/4楼的“starytx,拾瓦星哥”指出该错误;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 	感谢7楼的“adeng1919,懒懒的吉他手”给出提醒.>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2.指针指向错误，首先指到分配的内存空间，然后又将指针指向const IplImage *img，并在后面的操作试图修改指针内容     感谢6/9/17/20/21/23/24的“xihu1364,版主大哥”指出错误，并提出解决方案以及告诫。>>> 	感谢10楼的“starytx,拾瓦星哥”描述。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 	感谢30楼的“jianwen0529，jianwen0529”指出该错误。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 	感谢31楼的“terhack，terhack”的提醒。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *******************************************************/ //直接修改为：：： IplImage *gray32=(IplImage *)malloc(sizeof(IplImage));  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; 3.未对结构体成员指针分配内存空间 	感谢25/26/28楼的“bijiaoben，大奶兔白糖”指出该错误，以及提供解决方案。 *******************************************************/ //修改为：：： int width=img->width; int heigh=img->height; int step=img->widthStep; int nchan=img->nChannels; float *data=(float*)gray32->imageData; data=(float *)malloc(sizeof(float)*width*heigh); char * dat=img->imageData;  for (i=0;i<heigh;i++) { 	for (j=0;j<width;j++) 	{ 		if(nchan==3) 			data[i*step+j]=(dat[i*step+j*nchan]+dat[i*step+j*nchan+1]+dat[i*step+j*nchan+2])/765.0; 		else 		{ 			data[i*step+j]=(dat[i*step+j])/255.0f; 		//	printf("i=%d,j=%d,c=%d\n",i,j,c++); 		} 	} } //free(gray) //不再次使用 return gray32; } //这样修改可以保证这段代码可以运行，数据是不完整的， //因此IplImage数据结构内的很多成员参数都需要初始化， //不然得出的结果后面的程序是不能使用的， //只针对这段代码的本身的错误进行修改。 //另外感谢全楼成员的指导和帮助  /***************************警戒线*******以示自己对整个结构，指针的不了解**********************************/ //另外我也修改了一份把IplImage数据结构内的重要成员初始化的代码，后面的程序可以使用 IplImage *getGray(const IplImage *img) { 	IplImage *gray32=0; 	gray32=(IplImage *)malloc(sizeof(*gray32)); 	memset( gray32, 0, sizeof( *gray32 )); 	gray32->nSize=sizeof( *gray32 ); 	gray32->height=img->height; 	gray32->width=img->width; 	gray32->align=4; 	gray32->nChannels = 1; 	gray32->widthStep = 3200; 	gray32->imageSize=gray32->widthStep*gray32->height; 	gray32->origin=0; 	 	int i=0,j=0; 	int height = img->height; 	int width  = img->width; 	int step   = img->widthStep/sizeof(float); 	int nchan  = img->nChannels; 	float * data=(float*)malloc(sizeof(float)*width*height); 	gray32->imageData =(char*) data; 	char * dat = img->imageData;	   	for (i=0;i<height;i++) 		{ 			for (j=0;j<width;j++) 			{ 				if(nchan==3) 					data[i*step+j]=(float)(dat[i*step+j*nchan]+dat[i*step+j*nchan+1]+dat[i*step+j*nchan+2])/765.0f; 				else 					data[i*step+j]=(float)(dat[i*step+j])/255.0f;  			} 			 		}         return gray32; } /*************************************************************************************/

user: user-4
content: 引用 22 楼 chengkun183 的回复:[quote=引用 18 楼 xihu1364 的回复:] 发现提问题的...都是这么被动，根本不动脑子... IplImage *getGray(const IplImage *img) { 	IplImage *gray32=(IplImage *)malloc(sizeof(IplImage));  	memcpy(gray32,img,sizeof(IplImage));     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; 	float *data2=(float*)img->imageData; 	 	for (i=0;i<heigh;i++) 	{ 		for (j=0;j<width;j++) 		{ 			if(nchan==3) 				data[i*step+j]=(data2[i*step+j*nchan]+data2[i*step+j*nchan+1]+data2[i*step+j*nchan+2])/765.0; 			else 			{ 				data[i*step+j]=(data2[i*step+j])/255.0f; 				printf("i=%d,j=%d,c=%d\n",i,j,c++); 			} 		} 	} 	return gray32; } 修改成这样，错误依旧。[/quote] 你不要老是盯着错误，你得看怎么错了，去找问题，不是可以调试吗？  还有，一些基础知识你得在问题中去积累经验吧，这个才是重点吧.上面我就说了出问题的地方，自己去研究下。感觉你就是把代码贴上，问题提出来，就靠人家帮你弄好....

user: user-0
content: 引用 18 楼 xihu1364 的回复:发现提问题的...都是这么被动，根本不动脑子... IplImage *getGray(const IplImage *img) { 	IplImage *gray32=(IplImage *)malloc(sizeof(IplImage));  	memcpy(gray32,img,sizeof(IplImage));     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; 	float *data2=(float*)img->imageData; 	 	for (i=0;i<heigh;i++) 	{ 		for (j=0;j<width;j++) 		{ 			if(nchan==3) 				data[i*step+j]=(data2[i*step+j*nchan]+data2[i*step+j*nchan+1]+data2[i*step+j*nchan+2])/765.0; 			else 			{ 				data[i*step+j]=(data2[i*step+j])/255.0f; 				printf("i=%d,j=%d,c=%d\n",i,j,c++); 			} 		} 	} 	return gray32; } 修改成这样，错误依旧。

user: user-4
content: 还有 int imageSize;  //这应该是下面指针内容的大小    char *imageData;  //你上面贴的代码很有问题....

user: user-4
content: 引用 19 楼 chengkun183 的回复:[quote=引用 15 楼 xihu1364 的回复:] 你把结构体IplImage定义贴出来？ 结构体typedef struct _IplImage { 	int nSize;                     	int ID;                          	int nChannels;            	int alphaChannel;  	int depth;  	char colorModel[4];  	char channelSeq[4];  	int dataOrder;  	int origin;  	int align;  	int width;  	int height; 	struct _IplROI *roi; 	struct _IplImage *maskROI;  	void *imageId;  	struct _IplTileInfo *tileInfo;  	int imageSize;  	char *imageData;  	int widthStep;  	int BorderMode[4];  	int BorderConst[4];  	char *imageDataOrigin;  }IplImage;[/quote] imageData这个是变长啊.... 楼主，出问题的地方，我估计是越界了.  首先，分少了，哈哈！ 其次，你分配内存的时候，应该以nSize（应该用这个结构体的大小）去分配内存。用sizeof（IplImage）前提是，该结构体是定长.

user: user-0
content: 引用 15 楼 xihu1364 的回复:你把结构体IplImage定义贴出来？ 结构体typedef struct _IplImage { 	int nSize;                     	int ID;                          	int nChannels;            	int alphaChannel;  	int depth;  	char colorModel[4];  	char channelSeq[4];  	int dataOrder;  	int origin;  	int align;  	int width;  	int height; 	struct _IplROI *roi; 	struct _IplImage *maskROI;  	void *imageId;  	struct _IplTileInfo *tileInfo;  	int imageSize;  	char *imageData;  	int widthStep;  	int BorderMode[4];  	int BorderConst[4];  	char *imageDataOrigin;  }IplImage;

user: user-4
content: 发现提问题的...都是这么被动，根本不动脑子...

user: user-4
content: 引用 16 楼 chengkun183 的回复:[quote=引用 10 楼 starytx 的回复:] 确实是指针指向分配的空间了，但是后来却又指向形参的指向了，指针误用 如何能指向分配空间，又能使用形参呢？[/quote] IplImage *gray=(IplImage *)malloc(sizeof(IplImage));   memcpy(gray,img,sizeof(IplImage)); 这句话不就是吗？

user: user-0
content: 引用 10 楼 starytx 的回复:确实是指针指向分配的空间了，但是后来却又指向形参的指向了，指针误用 如何能指向分配空间，又能使用形参呢？

user: user-4
content: 你把结构体IplImage定义贴出来？

user: user-0
content: 引用 6 楼 xihu1364 的回复: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类，有重载=运算符不，直接=过来....  我这样来： 	IplImage *gray=(IplImage *)malloc(sizeof(IplImage));  	memcpy(gray,img,sizeof(IplImage)); 	IplImage *gray32=gray; ：：： //free(gray);//注释掉 错误依然

user: user-0
content: 引用 6 楼 xihu1364 的回复: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类，有重载=运算符不，直接=过来.... 木有无视，正在测试……

user: user-4
content: ...回复内容，被LZ无视....

user: user-0
content: 引用 7 楼 adeng1919 的回复:IplImage *gray=(IplImage *)malloc(sizeof(IplImage *)); 内存没被分配到足够大  改为：IplImage *gray=(IplImage *)malloc(sizeof(IplImage*)*img->width*img->height); 错误依然是不能read,

user: user-5
content: 确实是指针指向分配的空间了，但是后来却又指向形参的指向了，指针误用

user: user-6
content: 试图修改静态数据img->imageData;  float *data=(float*)gray32->imageData; 因为是指针，所以data指向的一直都是img->imageData的内存块 本来是静态的数据，你data[]试图修改之，所以不能报错！

user: user-4
content: 不知道你理解到你出错的地方没有？  出错原因就是你申请的内存根本就没用，而是用的const IplImage *img，这个是const，你就修改，肯定出错