3

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

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

然后运行一个 for 循环以通过 p 分配整数 - 这似乎与声明一个 int 变量并为其分配一个整数不同:

int x = 10;

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

我在这里错过了什么吗?非常感谢。

4

5 回答 5

1

当您需要一个数据数组时,例如当您从用户那里收到数字但不知道不能使用固定数量的整数的长度时,您需要一种动态的方式来为这些整数创建内存。malloc他的朋友让你这样做。除其他事项外:

  • malloc 允许您以您现在需要的大小动态创建内存。
  • 使用 malloc 时,退出范围时不会释放内存。
  • 使用 malloc 让我们说 10 个项目的数组或在堆栈上创建一个 10 个项目的数组 在“显式声明您希望将 int 存储在内存中”的意义上没有区别,只是我写的内容有所不同这里还有更多

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

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

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

  • 变量可以全局访问
  • 内存大小没有限制
  • (相对)较慢的访问
  • 不能保证有效地使用空间,随着内存块的分配和释放,内存可能会随着时间的推移而变得碎片化
  • 你必须管理内存(你负责分配和释放变量)
  • 可以使用 realloc() 调整变量的大小
于 2013-08-22T12:41:52.213 回答
0

1.如果你知道数组大小。使用int array[10]int *array = malloc(10*sizeof(int)). 仅当您在运行时之前不知道大小时,您才需要malloc东西。

2.声明int x = 10x存放在栈内存中。如果您声明存储在堆栈内存中但内存int *p = malloc(10*sizeof(int));指针在堆中。pp

3.当你使用int *p = malloc(10*sizeof(int));时,函数分配一块内存,它只有正确的大小。事实上,你可以在这个内存中存储你想要的类型,尽管不鼓励这样做。

4.如果你使用int x = 10,内存将被自动释放,就在变量超出其范围之后。如果你使用malloc,你应该自己释放内存,否则内存泄漏!

于 2013-08-22T12:52:43.280 回答
0

malloc 分配一个内存块并返回一个指向它的指针,它的生命周期与动态分配的内存一样。您可以在其中存储其类型的任何对象。一个整数

int x = 10;

是自动存储,是左值而不是指针。所以你不必通过它的地址来访问它,因为你必须通过一个指针指向的值来访问它。您可以通过它的标识符名称访问和分配它的值。当你离开它的范围时,它也会被清理干净。

我再次为您从已删除的答案中总结您的问题: malloc() 返回一个原始数据块,不会为任何类型保留。即使您将它分配给一个 int 左值,数据块也不是 int 类型,直到您将其取消引用为 thoose。(意味着您将它与特殊类型的数据一起使用。)您获得的块由解析为以字节为单位的函数的参数描述。sizeof() 表示类型的大小。因此,在这种情况下,您将获得一个可容纳 10 个整数的块。但如果你还没有将它与 int * ptr 一起使用,你也可以将地址分配给 char 类型的指针,并将该块用作 40 个 char 变量的内存块。但是当你第一次“把东西放在那里”时,它就会被保留为那种类型。

于 2013-08-22T12:26:45.947 回答
0

在 C 中声明的变量int x = 10位于堆栈上,只有在它声明的函数返回之前才能访问(如果它在函数外部声明,我们称它为全局变量,它在应用程序的整个运行时都可用)。

分配的内存malloc和类似的功能位于堆中,在显式释放(例如调用free(...))或应用程序终止(如果是服务器可能需要数周/数月/数年)之前,可以访问它。

栈和堆都是内存的一部分,主要区别在于分配方式。在 C 中, the*&一元运算符可以模糊两者之间的界限,因此例如在声明的情况下,int x = 10您可以获得地址int* y = &x,同时,您也可以像*y = 15在指针的情况下一样分配值.

于 2013-08-22T12:26:56.620 回答
0

好吧,当你在做

            int x = 10;

编译器会做任何需要做的事情。但是当您使用 malloc() 时,您负责维护该内存块,您可以随意使用它,这也给您带来了正确清理它的负担。

于 2013-08-22T12:39:49.573 回答