将指针传递给SDL函数



我试图理解为什么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中。没有人能住在假地址。

不幸的是,您可以在代码中编写任何您想要的内容。只有当你运行它并尝试将1放入房间x时,计算机才会大喊大叫。"访问违规"基本上意味着:"你试图将一些数据放在一个你无法访问的地址中"。在这种情况下,伪地址NULL不是一个可以存储任何东西的地址。

如果你遵循Armin的建议,那么offset将指向一个有效的地址,这将允许你在房间x中存储1。方法1通过传递预分配结构offset的地址(它由编译器在堆栈上自动分配)来解决这个问题。

第二种情况下你没有为offset保留任何内存,因为SDL_Rect* offset只是一个指针,你必须为它分配内存来指向一些东西:

示例在c:

SDL_Rect* offset = malloc( sizeof( SDL_Rect ) );

最新更新