我正在尝试理解为什么method1工作,而当我将“offset”传递给SDL_BlitSurface函数时,method2不起作用。
用法:
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
在我看来,两者都应该有效,因为SDL_BlitSurface函数要求SDL_Rect *作为第4个输入参数。在这两种情况下,我都将SDL_Rect *传递给了该函数。但是,method2会产生“未处理的异常访问冲突写入位置错误”。请帮忙!
方法1:
SDL_Rect offset;
offset.x = 1;
SDL_BlitSurface( source, NULL, destination, &offset );
方法2:
SDL_Rect* offset = NULL;
offset->x = 1;
SDL_BlitSurface( source, NULL, destination, offset );
(来自Lazy Foo教程第2课的代码)
答案 0 :(得分:2)
指针变量(如offset
)包含一个地址,就像一个住宅地址。
该结构告诉住在每个房间的房子里的计算机(房间有名字,例如x
)。
问题是你先说:“offset
是假地址(称之为NULL)。”然后你说“并且在房间x
生活1”。所以这没有意义 - 只有当地址是真实的时,数字1才能存在于房间x
中。没有人可以住在假地址。
不幸的是,您可以在代码中编写任何您想要的内容。只有当你运行它并尝试将1放入房间x
时,计算机才会喊叫。 “访问冲突”基本上意味着:“您正试图将一些数据放入您无权访问的地址”。在这种情况下,假地址NULL不是您可以存储任何内容的地址。
如果您遵循Armin的建议,那么offset
将指向有效地址,这样您就可以在房间x
中存储1。方法1通过传递预分配结构offset
的地址(它由编译器在堆栈上自动分配)来解决问题。
答案 1 :(得分:1)
在第二种情况中,您没有为offset
保留任何内存,因为SDL_Rect* offset
只是一个指针,您必须为它分配内存以指向某些内容:
c
中的示例:
SDL_Rect* offset = malloc( sizeof( SDL_Rect ) );
然后你的第二种方法会起作用。