Pointers 将指针传递给SDL函数
当我将“偏移量”传递给SDL_BlitSurface函数时,我试图理解为什么方法1有效,而方法2无效 用法: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产生“未处理的
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通过传递预先分配的结构偏移量
(由编译器在堆栈上自动分配)的地址来解决问题