首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C和malloc中的数组

C和malloc中的数组
EN

Stack Overflow用户
提问于 2013-02-23 03:13:55
回答 5查看 2.7K关注 0票数 3

1.这两个维度是如何存储在内存中的,它们是连续的吗?(我的意思是intM,不是动态分配,我认为intM发生在堆栈区域,所以是连续的,不是吗?)

2. malloc分配的区域是否必须是连续的?

3.如果不需要动态分配内存空间,应该在哪里使用?堆栈或堆。例如,我想要一个字符数组来存储10000个字符,那么我应该使用:

代码语言:javascript
复制
char a[10000];

代码语言:javascript
复制
char *a = calloc(sizeof(char),10000);

“函数调用栈”是否与变量栈在同一区域??在同一堆栈中还是不同?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-23 03:20:16

int numbers[m][n]中,n是内存中连续的int,例如numbers[0][0]后面跟着numbers[0][1]

另一方面,假设是n=10,那么numbers[m][9]后面就是numbers[m+1][0]

malloc返回连续的内存。你决定如何使用它。

堆栈上一个10000字节的数组是没有问题的,除非函数是递归的,而且(正如Carey所说的),除非你是在一个小的堆栈环境中开发的。嵌入。

是的,callstack和局部变量是相同的。

票数 4
EN

Stack Overflow用户

发布于 2013-02-23 03:17:00

  1. 内存是连续的。一个维度中的所有项目都将是连续的,后面跟着下一个dimension.
  2. Yes.
  3. 如果你需要很多内存,我建议你动态分配。对于较少的内存,您可以静态分配。malloc()确实使用了堆。我不推荐堆栈,除非只有很少的内存。
票数 1
EN

Stack Overflow用户

发布于 2013-02-23 03:19:03

当你分配一些东西时,它是连续的吗?

当我制作具有平铺地图的游戏时,我甚至会在渲染时使用指针来访问平铺。

例如,如果地图是10x10,我会使用arrayName[14]来渲染瓷砖1。

还请记住,在某些地方,b而不是a将完全存储在内存中,如果您依赖于来自FORTRAN (如CBLAS)或某些特定设备和情况(如具有某些特定驱动程序的GPU )的代码,这可能会导致错误。

当你使用malloc时,它必须是连续的?

是,如果连续内存不可用,它将失败。一个很常见的错误是期望一个程序会工作,因为总的空闲内存存在,而没有考虑内存碎片。

我曾经做过一个游戏,因为它有30mb的内存,但无法加载16mb的图像,所以无法正常工作。我当时并没有意识到我的代码导致的内存碎片并没有使16mb的数据块可用。

如果不需要动态分配,我应该使用堆栈还是堆?

在C中,动态分配通常意味着堆分配,早期的C书籍甚至明确地说,malloc和类似的函数族(包括calloc)只在堆上操作。而自动分配尝试使用堆栈。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15031566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档