C 这是基于堆栈的内存吗 #包括 内部主(空) { SDL_表面*屏幕; 屏幕=SDL_设置视频模式(640、480、32、SDL_表面); 返回0; }

C 这是基于堆栈的内存吗 #包括 内部主(空) { SDL_表面*屏幕; 屏幕=SDL_设置视频模式(640、480、32、SDL_表面); 返回0; },c,C,屏幕是指向需要大量内存的绘图的后缓冲区的指针 我的问题是,这样定义的屏幕是基于堆栈的内存,因为堆内存将使用malloc。由于堆栈内存是有限的,上面的代码是不好的,因为它占用了很多有限的堆栈内存,所以应该改用堆内存。但这段代码来自开源代码,我想他们知道自己在做什么 这里,screen是指向动态分配的SDL_曲面结构的指针,该结构本身有一个指向实际像素数据的成员void*pixels。指针仅占用4或8字节的堆栈空间,具体取决于您是在32位还是64位系统上 当您调用SDL\u Quit()时,SDL释

屏幕是指向需要大量内存的绘图的后缓冲区的指针


我的问题是,这样定义的屏幕是基于堆栈的内存,因为堆内存将使用malloc。由于堆栈内存是有限的,上面的代码是不好的,因为它占用了很多有限的堆栈内存,所以应该改用堆内存。但这段代码来自开源代码,我想他们知道自己在做什么

这里,
screen
是指向动态分配的
SDL_曲面
结构的指针,该结构本身有一个指向实际像素数据的成员
void*pixels
。指针仅占用4或8字节的堆栈空间,具体取决于您是在32位还是64位系统上


当您调用
SDL\u Quit()
时,SDL释放主视频曲面,但当您使用
SDL\u CreateRGBSurface()
自行分配曲面时,必须调用
SDL\u FreeSurface()
以释放内存。您还可以在
SDL\u video.h
中找到其成员的完整列表中的
SDL\u Surface
声明。

堆栈上除了指针本身没有分配任何内容。

SDL\u SetVideoMode是否分配内存或返回指向预先分配的内容的指针?从某种意义上说,这并不重要,因为(我假设)这段代码已经运行,进程已经退出,在这种情况下,所有进程内存都将返回到操作系统


(请注意,“内存被返回到操作系统”并不十分准确,因为每个进程都有自己的虚拟地址空间等,而“返回”内存只是意味着以前分配给该进程虚拟内存的任何真实内存都可以在别处自由使用。)

为了加深理解:它不能被堆栈分配。原因很清楚-函数只能在更高的位置(从堆栈的角度来看)堆栈分配数据,即。E在较低的地址(视为内存地址)比自己的堆栈帧,即。E作为存储返回地址的位置

这意味着从函数返回时,它在堆栈上分配的所有内存都必须(并且将)被释放


如果函数返回的指针仍然有效,则该指针指向的内存必须位于“持久”数据空间的某个位置,很可能位于堆上。

这肯定是堆分配的。
#include <SDL/SDL.h>

int main (void)
{
  SDL_Surface* screen;
  screen=SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
  return 0;
}