Pointers 将指针传递给SDL函数

Pointers 将指针传递给SDL函数,pointers,sdl,Pointers,Sdl,当我将“偏移量”传递给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*。然而,method2产生“未处理的

当我将“偏移量”传递给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*。然而,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课)

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

c
中的示例:

SDL_Rect* offset = malloc( sizeof( SDL_Rect ) );
然后第二种方法将起作用。

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

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

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

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