C和malloc中的数组
如何将二维存储在内存中,它们是否连续? (我的意思是int [M] [N],而不是动态分配,我认为int [M] [N]发生在堆栈区域,所以持续不断,不是吗?)
2. malloc分配的区域必须是连续的吗?
3.如果不需要动态分配内存空间,我应该在哪里使用? 堆栈或堆。 例如,我想要一个char数组来存储10000个字符,所以我应该使用:
char a[10000];
要么
char *a = calloc(sizeof(char),10000);
“函数调用堆栈”与变量堆栈在同一区域?在同一个堆栈中还是不同的?
在int numbers[m][n]
,n在内存中是连续的整数,例如numbers[0][0]
后面跟着numbers[0][1]
。
另一方面,假设n = 10,则numbers[m][9]
后面跟随numbers[m+1][0]
。
malloc
返回连续的内存。 你决定如何使用它。
一个10000字节的数组在堆栈上是没有问题的,除非该函数是递归的(如Carey注释),除非您正在开发一个小堆栈环境,例如。 嵌入式。
是的,callstack和局部变量是相同的。
内存是连续的。 一个维度中的所有项目都是连续的,接下来是维度。
是。 通过一次调用malloc()
分配的所有内存都是连续的。
如果您需要大量内存,我建议动态分配它。 对于更少的内存,您可以静态分配。 malloc()
确实使用堆。 除了只有非常少量的内存之外,我不推荐堆栈。
当你分配一些[a] [b]它是连续的吗?
是
当我制作平铺地图的游戏时,我甚至会在渲染中使用指针访问平铺。
即:如果地图是10x10,例如我会使用arrayName[14]
渲染tile [1] [3]。
还要记住,在某些地方,[b]而不是[a]是完全在内存中的东西,如果你依赖来自FORTRAN的代码(如CBLAS)或者在一些特定的设备和情况(例如某些特定驱动程序的GPU)。
当你使用malloc时,它必须是连续的?
是的,如果连续内存不可用,它将失败。 这是一个非常常见的错误,期望程序可以工作,因为存在全部空闲内存,而不会考虑内存碎片。
我曾经制作过一款游戏,因为它具有30mb的内存,但无法加载16mb图像,因此无法工作......当时我并没有意识到由我的代码导致的内存碎片没有提供16mb的可用块。
如果不需要动态分配,我应该使用堆栈或堆?
在C语言中,动态分配无论如何通常意味着堆分配,早期的C书甚至明确表示, malloc
和类似的函数系列(包括calloc
)只能在堆上运行。 而自动分配尝试使用堆栈。