将指针传递给SDL函数

时间:2013-03-23 11:46:06

标签: pointers sdl

我正在尝试理解为什么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课的代码)

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 ) );

然后你的第二种方法会起作用。