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