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 )只能在堆上运行。 而自动分配尝试使用堆栈。

    链接地址: http://www.djcxy.com/p/82527.html

    上一篇: Array in C and malloc

    下一篇: memory allocation in Stack and Heap