2013-08-22 48 views
3

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

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

,然后运行for循环P代表整数 - 这似乎声明int变量并分配给它的整数喜欢不同:

int x = 10; 

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

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

+0

好吧,因为答案已被删除,所以我在这里再次为您归纳它:malloc()返回原始数据块,不保存任何类型的数据。即使你将它赋给一个int左值,数据块也不是int类型的,直到你将它作为参数去参考。 (意味着你将它与特殊类型的数据一起使用。)你得到的块通过解析为Bytes函数的参数来描述。 sizeof()表示类型的大小。 – dhein

+0

所以你在这种情况下得到了一个有10个整数的块。但是如果你没有使用int * ptr,你也可以将地址赋给一个char类型的指针,并将该块作为内存块用于40个char值。但是,第一次你“把东西放在那里”然后它保存了那种类型。我也会为你解答这个问题;) – dhein

+0

非常感谢你的努力@Zaibis! – trueskyblue

回答

0

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

int x = 10; 

是自动存储,是一个左值而不是指针。 所以你不必通过它的地址访问它,因为你必须通过一个指针指向的值。 您可以通过它的识别器名称访问并分配它的值。 它也清理,当你离开它的范围。

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

0

用C像int x = 10声明的变量位于堆栈,它只能访问,直到它的回报声明(如果它对外宣称的功能,我们称之为全球性的,它通过应用程序的整个运行时的可用)的功能上。

内存与malloc分配和相似的功能都位于堆,这是访问或者直到它释放明确(例如呼叫free(...))或应用程序终止时(在服务器可能需要数周/月/年的情况下)。

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

+0

你不知道他们将位于堆栈或其他地方!同样的堆。 – dhein

+0

理论上,你是对的,但是,我还没有看到一个主流编译器生产的代码没有将局部变量放入堆栈。 – dnet

+0

'int x = 10;'不一定是局部变量。它可能是全球性的,因此具有静态存储。 –

0

那么,当你在做

  int x = 10; 

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

1

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

  • malloc让您以现在需要的大小动态地创建内存。
  • 使用malloc时,内存将在退出示波器时释放内存而不是
  • 使用malloc让我们说数组的10个项目或在堆栈上创建10个项目的数组没有区别的意思是“显式声明,你想要一个int存储在内存中”,只是在我的差异“已经写在这里和一些

here是堆之间的差异的文章,堆栈

我正在写的每一个方法的优点:

堆栈

  • 非常快的访问
  • 没有明确取消分配变量
  • 空间被有效地管理CPU,内存不会变得支离破碎
  • 局部变量只
  • 限制的堆栈大小(依赖于操作系统的)
  • 变量不能调整大小

  • 变量可全局访问
  • 内存大小没有限制
  • (相对)更慢的存取
  • 没有保证有效地利用空间,由于存储器块被分配存储器可以随时间变得支离破碎,然后释放
  • 你必须管理内存(你负责分配和释放的变量)
  • 变量可以使用的realloc调整大小()
+0

堆栈大小限制(取决于操作系统)不完全正确......也取决于编译器! – dhein

+0

@Zaibis谢谢你的补充,但它也写 - 操作系统依赖 –

0

1.如果知道数组大小。使用int array[10]int *array = malloc(10*sizeof(int))更快,更安全。只有当你在运行时间之前不知道大小,那么你需要malloc的东西。

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

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

4.如果使用int x = 10,内存将被释放auto,仅在变量超出其范围之后。如果您使用malloc,则应该自行释放内存或内存泄漏!

+0

我再一次说,你知道它真的会被存储在堆栈或其他... – dhein

+0

@Zaibis你让我陷入困境。我们怎么能不知道? –

+0

因为编译器必须在最后一个实例中决定它。我们可以假设把它放在那里或在这里,或永远。 – dhein