关于内存/ malloc的一些问题

时间:2013-08-22 12:22:03

标签: c variables malloc

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

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

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

int x = 10;

因为它是一个更明确的声明,你想要一个存储在内存中的int,而在malloc中它只是你通过指针算术遍历的一块内存。

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

5 个答案:

答案 0 :(得分:1)

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

  • malloc允许您以您现在需要的大小动态创建内存。
  • 使用malloc时,在退出示波器时,内存将被释放。
  • 使用malloc让我们说10个项目的数组或者在堆栈上创建10个项目的数组在“明确声明你想要一个int存储在内存中”的意义上没有区别,只有我的差异已写在这里,还有更多

here是一篇关于堆和堆栈之间差异的文章

我正在写各种方式的专业人士:

<强>堆栈

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

<强>堆

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

答案 1 :(得分:0)

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

int x = 10;

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

好吧,当你做的时候

            int x = 10;

编译器会做任何需要做的事情。但是当你使用malloc()时,你负责维护那个内存块,你可以根据自己的意愿使用它,这也为你提供了正确清理它的负担。

答案 4 :(得分:0)

1.如果您知道阵列大小。使用int array[10]int *array = malloc(10*sizeof(int))更快,更安全。只有你在运行时才知道大小,那么你需要malloc

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

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

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