变量是如何真正存储在内存中的?我问这个是因为说你malloc一段内存并将它分配给一个指针,例如有关内存/ malloc的一些问题
int *p = malloc(10 * sizeof(int));
,然后运行for循环P代表整数 - 这似乎声明int变量并分配给它的整数喜欢不同:
int x = 10;
因为它是一个更明确的声明,你想要一个存储在内存中的int,而在malloc中它只是你通过指针运算遍历的一块内存。
我在这里错过了什么吗?非常感谢。
变量是如何真正存储在内存中的?我问这个是因为说你malloc一段内存并将它分配给一个指针,例如有关内存/ malloc的一些问题
int *p = malloc(10 * sizeof(int));
,然后运行for循环P代表整数 - 这似乎声明int变量并分配给它的整数喜欢不同:
int x = 10;
因为它是一个更明确的声明,你想要一个存储在内存中的int,而在malloc中它只是你通过指针运算遍历的一块内存。
我在这里错过了什么吗?非常感谢。
malloc分配一个内存块并返回一个指向它的指针,它的生存时间是动态分配的内存。您可以在其中存储任何类型的对象。 一个int
int x = 10;
是自动存储,是一个左值而不是指针。 所以你不必通过它的地址访问它,因为你必须通过一个指针指向的值。 您可以通过它的识别器名称访问并分配它的值。 它也清理,当你离开它的范围。
我总结一下你的问题,从这里删除的答案再次为你:malloc()返回一个原始数据块,它不会保留任何类型。即使你将它赋给一个int左值,数据块也不是int类型的,直到你将它作为参数去参考。 (意味着你将它与特殊类型的数据一起使用。)你得到的块通过解析为Bytes函数的参数来描述。 sizeof()表示类型的大小。所以你在这种情况下得到一个有10个整数的块。但是如果你没有使用int * ptr,你也可以将地址赋给char类型的指针,并将该块用作40个char变量的内存块。但是,第一次你“把东西放在那里”然后它保存了那种类型。
用C像int x = 10
声明的变量位于堆栈,它只能访问,直到它的回报声明(如果它对外宣称的功能,我们称之为全球性的,它通过应用程序的整个运行时的可用)的功能上。
内存与malloc
分配和相似的功能都位于堆,这是访问或者直到它释放明确(例如呼叫free(...)
)或应用程序终止时(在服务器可能需要数周/月/年的情况下)。
堆栈和堆都是内存的一部分,主要区别在于分配方法。在C中,一元运算符*
和&
可能会模糊两者之间的界限,因此例如在类似int x = 10
这样的声明的情况下,您可以获得类似int* y = &x
的地址,并且同时可以指定一个值,例如*y = 15
的指针。
那么,当你在做
int x = 10;
编译器做任何需要做的事情。但是当你使用malloc()时,你负责维护这个内存块,你可以根据自己的意愿使用它,这也给你正确清理它的Burdon。
当你需要一个数据数组时,例如当你从用户接收到数字但不知道长度时你不能使用固定数量的整数,你需要一个动态的方法来为这些整数存储内存。 malloc
和他的朋友让你这样做。其中包括:
here是堆之间的差异的文章,堆栈
我正在写的每一个方法的优点:
堆栈
堆
堆栈大小限制(取决于操作系统)不完全正确......也取决于编译器! – dhein
@Zaibis谢谢你的补充,但它也写 - 操作系统依赖 –
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
,则应该自行释放内存或内存泄漏!
好吧,因为答案已被删除,所以我在这里再次为您归纳它:malloc()返回原始数据块,不保存任何类型的数据。即使你将它赋给一个int左值,数据块也不是int类型的,直到你将它作为参数去参考。 (意味着你将它与特殊类型的数据一起使用。)你得到的块通过解析为Bytes函数的参数来描述。 sizeof()表示类型的大小。 – dhein
所以你在这种情况下得到了一个有10个整数的块。但是如果你没有使用int * ptr,你也可以将地址赋给一个char类型的指针,并将该块作为内存块用于40个char值。但是,第一次你“把东西放在那里”然后它保存了那种类型。我也会为你解答这个问题;) – dhein
非常感谢你的努力@Zaibis! – trueskyblue