变量是如何真正存储在内存中的?我问这个是因为假设你 malloc 一段内存并将其分配给一个指针,例如
int *p = malloc(10 * sizeof(int));
然后运行一个 for 循环以通过 p 分配整数 - 这似乎与声明一个 int 变量并为其分配一个整数不同:
int x = 10;
因为这是一个更明确的声明,您希望将 int 存储在内存中,而在 malloc 中,它只是您通过指针算术遍历的一块内存。
我在这里错过了什么吗?非常感谢。
当您需要一个数据数组时,例如当您从用户那里收到数字但不知道不能使用固定数量的整数的长度时,您需要一种动态的方式来为这些整数创建内存。malloc
他的朋友让你这样做。除其他事项外:
这是一篇关于堆和堆栈之间区别的文章
我正在写每种方式的优点:
堆
堆
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
,内存将被自动释放,就在变量超出其范围之后。如果你使用malloc
,你应该自己释放内存,否则内存泄漏!
malloc 分配一个内存块并返回一个指向它的指针,它的生命周期与动态分配的内存一样。您可以在其中存储其类型的任何对象。一个整数
int x = 10;
是自动存储,是左值而不是指针。所以你不必通过它的地址来访问它,因为你必须通过一个指针指向的值来访问它。您可以通过它的标识符名称访问和分配它的值。当你离开它的范围时,它也会被清理干净。
我再次为您从已删除的答案中总结您的问题: malloc() 返回一个原始数据块,不会为任何类型保留。即使您将它分配给一个 int 左值,数据块也不是 int 类型,直到您将其取消引用为 thoose。(意味着您将它与特殊类型的数据一起使用。)您获得的块由解析为以字节为单位的函数的参数描述。sizeof() 表示类型的大小。因此,在这种情况下,您将获得一个可容纳 10 个整数的块。但如果你还没有将它与 int * ptr 一起使用,你也可以将地址分配给 char 类型的指针,并将该块用作 40 个 char 变量的内存块。但是当你第一次“把东西放在那里”时,它就会被保留为那种类型。
在 C 中声明的变量int x = 10
位于堆栈上,只有在它声明的函数返回之前才能访问(如果它在函数外部声明,我们称它为全局变量,它在应用程序的整个运行时都可用)。
分配的内存malloc
和类似的功能位于堆中,在显式释放(例如调用free(...)
)或应用程序终止(如果是服务器可能需要数周/数月/数年)之前,可以访问它。
栈和堆都是内存的一部分,主要区别在于分配方式。在 C 中, the*
和&
一元运算符可以模糊两者之间的界限,因此例如在声明的情况下,int x = 10
您可以获得地址int* y = &x
,同时,您也可以像*y = 15
在指针的情况下一样分配值.
好吧,当你在做
int x = 10;
编译器会做任何需要做的事情。但是当您使用 malloc() 时,您负责维护该内存块,您可以随意使用它,这也给您带来了正确清理它的负担。