1

当我将“偏移”传递给 SDL_BlitSurface 函数时,我试图理解为什么方法 1 有效,而方法 2 无效。

用法:

int SDL_BlitSurface(SDL_Surface *src,  SDL_Rect *srcrect,  SDL_Surface *dst, SDL_Rect *dstrect);

在我看来,两者都应该工作,因为 SDL_BlitSurface 函数要求 SDL_Rect* 作为第四个输入参数。在这两种情况下,我都将 SDL_Rect* 传递给函数。但是方法 2 产生“未处理的异常访问冲突写入位置错误”。请帮忙!

方法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 课的代码)

4

2 回答 2

2

指针变量(如offset)保存地址,就像房屋地址一样。该结构告诉计算机谁住在每个房间的房子里(房间有名字,例如x)。

问题是你首先说:“offset是一个假地址(称之为NULL)。” 然后你说“房间里x住着1”。所以这没有意义——x只有地址是真实的,数字 1 才能住在房间里。没有人可以住在假地址。

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

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

于 2013-03-23T11:56:06.520 回答
1

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

示例c

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

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

于 2013-03-23T11:49:04.887 回答