关于loadimage函数使用的问题

0
typedef struct thing {
	IMAGE img;				//原图
	int x = 0;				//坐标
	int y = 0;
	int weight = NULL;		//决定上拉时的速度
	int flag = 1;			//用来标识物品的状态(没有被钩子抓住、被钩子抓住、已经被抓走了)
	int i;					//矿的标记
	struct  thing* next = NULL;
}TH;

TH *s;

loadimage(&s->img, "C:\\Users\\86135\\Desktop\\GoldMiner\\src\\HTMLgold.png", 175, 175);
transparentimage(NULL, s->x, s->y, &s->img, GREEN);//上面写好了函数,编译可以通过
//s->x  ,  s->y已经设置好了,可以在控制台监控变量的窗口看到(证明设置好了)
//但是在控制台的监控变量窗口看到s->img是未定义的。我不清楚是为什么

这样写对不对呢,调试可以通过,但运行的时候不能成功让 s->img 存储照片信息 。可以保证文件的路径完全正确没有问题。

我最开始是这样写的:

typedef struct thing {
	IMAGE img;				//原图
	int x = 0;				//坐标
	int y = 0;
	int weight = NULL;		//决定上拉时的速度
	int flag = 1;			//用来标识物品的状态(没有被钩子抓住、被钩子抓住、已经被抓走了)
	int i;					//矿的标记
	struct  thing* next = NULL;
}TH;

TH *s;
TH a;

loadimage(&a.img, "C:\\Users\\86135\\Desktop\\GoldMiner\\src\\HTMLgold.png", 175, 175);
//这里可以成功让a.img指向图片的地址
s->img = a.img;//这里会编译通过,但是运行过程中会出现指针访问异常
transparentimage(NULL, s->x, s->y, &s->img, GREEN);//上面的出现异常下面的就没有正常运行

所以我很疑惑,

第一个疑惑是关于loadimage()函数用法,是不是指针(TH *s)和正常结构体变量(TH a)在loadimage()函数用法不同,为什么会出现上面出现的问题?

第二个问题就是为什么  s->img = a.img;   这条语句会出现指针访问异常?

想了很久还是没有想出一个所以然,只能归结于自己才疏学浅,还请大佬批评指正~

ava
Mani

2020-6-10

0

两个问题一回事,是因为你没理解指针和动态内存分配。

执行:

TH *s;

只是声明了一个指针变量,并没有给这个变量分配存储空间。s 没有赋值,所以 s 并没有指向一个有效的可以使用的内存地址,之后你想将图片加载到这个内存地址,必定执行失败。

第二个问题同理,s 指向的地址不存在,所以 s->img 必定也不存在。这时候还要给 s->img 赋值,必定异常。

所以关键问题是:给 s 分配存储空间。这样写:

struct thing	// 建议这样定义结构体
{
	IMAGE img;				//原图
	int x = 0;				//坐标
	int y = 0;
	int weight = NULL;		//决定上拉时的速度
	int flag = 1;			//用来标识物品的状态(没有被钩子抓住、被钩子抓住、已经被抓走了)
	int i;					//矿的标记
	struct  thing* next = NULL;
};

thing *s;
s = new thing;				// 为 s 分配存储空间
loadimage(&s->img, "C:\\Users\\86135\\Desktop\\GoldMiner\\src\\HTMLgold.png", 175, 175);

注意,不再使用 s 的时候,需要释放之前分配的存储空间,否则会造成内存泄漏。这样释放:

delete s;
ava
慢羊羊

2020-6-10

不好意思我的问题,我忘记打上去了,我是使用molloc给s申请了动态空间。所以我会有这样的疑惑。刚刚我尝试了用 s = new thing; 的方法,发现给s->img分配地址成功了,然后我又换回了molloc申请空间的方法,发现又失败了,s->img确实是空的。不知道是什么原理。。。。。。。 -  Mani  2020-6-10
@Mani 因为 IMAGE 是 class(对象),必须用 new 分配空间,这样才会调用对象的构造函数和析构函数。而 malloc / free 不行。总的来说,new / delete 在功能上可以替代 malloc / free,并且书写清晰方便。 -  慢羊羊  2020-6-10
@慢羊羊 好滴好滴~ -  Mani  2020-6-11
技术讨论社区