c - 关于内存/malloc的一些问题

标签 c variables malloc

变量是如何真正存储在内存中的?我问这个是因为假设你 malloc 一段内存并将其分配给一个指针,例如

int *p = malloc(10 * sizeof(int));

然后运行 ​​for 循环以通过 p 分配整数 - 这似乎与声明 int 变量并向其分配整数不同,如下所示:

int x = 10;

因为这是一个更明确的声明,您希望将 int 存储在内存中,而在 malloc 中,它只是您通过指针算术遍历的一 block 内存。

我在这里遗漏了什么吗?非常感谢。

最佳答案

当您需要数据数组时,例如,当您从用户收到数字但不知道长度而无法使用固定数量的整数时,您需要一种动态方式来为这些整数创建内存。 malloc 和他的 friend 让你可以做到这一点。除其他事项外:

  • malloc 可让您根据当前需要的大小动态创建内存。
  • 使用 malloc 时,退出作用域时内存将不会被释放。
  • 使用 malloc 来表示 10 个项目的数组或在堆栈上创建一个 10 个项目的数组,在“显式声明您想要将 int 存储在内存中”的意义上没有区别,只是我的内容有所不同已经写在这里以及更多内容

here是一篇关于堆和栈区别的文章

我正在写每种方式的优点:

堆栈

  • 访问速度非常快
  • 不必显式取消分配变量
  • 空间由CPU有效管理,内存不会变得碎片
  • 仅限局部变量
  • 堆栈大小限制(取决于操作系统)
  • 无法调整变量大小

  • 变量可以全局访问
  • 内存大小没有限制
  • (相对)访问速度较慢
  • 无法保证空间的有效利用,随着内存块的分配和释放,内存可能会随着时间的推移而变得碎片化
  • 您必须管理内存(您负责分配和释放变量)
  • 可以使用 realloc() 调整变量的大小

关于c - 关于内存/malloc的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18380293/

相关文章:

objective-c - 如何编写只应在类本身内使用并且能够访问 ivars 的方法

c - 如何在c中找到行和列之间的分隔空间

java - 局部变量的最大内存分配

c - posix_memalign、malloc 和 calloc 在 lli 解释器中存在问题

c - 为什么我不能通过它的指针访问这个结构?

c - 读取文件的第一行在第一行给我一个 "\357\273\277"前缀

c - 在 C 中实现队列时遇到问题

bash - 在 Bash 中扩展变量中的变量

android - 方法中声明的最终静态 bool 变量

malloc - 什么是对齐的内存分配?