变量如何真正存储在内存中?我问这个是因为你说malloc一段内存并将它分配给一个指针,例如
int *p = malloc(10 * sizeof(int));
然后运行for循环以通过p分配整数 - 这似乎与声明一个int变量并为其分配一个整数不同:
int x = 10;
因为它是一个更明确的声明,你想要一个存储在内存中的int,而在malloc中它只是你通过指针算术遍历的一块内存。
我在这里遗漏了什么吗?非常感谢。
答案 0 :(得分:1)
当您需要一个数据数组时,例如当您从用户接收数字但不知道长度时您不能使用固定数量的整数时,您需要一种动态方法来为这些整数创建内存。 malloc
和他的朋友让你这样做。除其他外:
here是一篇关于堆和堆栈之间差异的文章
我正在写各种方式的专业人士:
<强>堆栈强>
<强>堆强>
答案 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 = 10
,x
存储在堆栈内存中。如果声明int *p = malloc(10*sizeof(int));
p
存储在堆栈内存中,但内存p
指针位于堆中。
3.当您使用int *p = malloc(10*sizeof(int));
时,该函数会分配一个块内存,它只有正确的大小。事实上,你可以在这个记忆中存储你想要的类型,但不鼓励这样做。
4.如果你使用int x = 10
,内存将自动释放,就在变量超出其范围之后。如果你使用malloc
,你应该自己释放内存,或者内存泄漏!