c-关于内存/malloc的一些问题



变量是如何真正存储在内存中的?我问这个问题是因为假设你对一段内存进行malloc,并将其分配给一个指针,例如

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

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

int x = 10;

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

我是不是遗漏了什么?非常感谢。

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

  • malloc允许您按照当前需要的大小动态创建内存
  • 使用malloc时,退出作用域时内存将不会被释放
  • 使用malloc作为10项数组,或者在堆栈上创建一个10项数组。在"明确声明您希望在内存中存储一个int"的意义上没有区别,只是我在这里写的内容和其他内容有所不同

这是一篇关于堆和堆栈之间的区别的文章

我正在写每种方式的优点:

堆栈

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

  • 变量可以全局访问
  • 内存大小没有限制
  • (相对)访问速度较慢
  • 如果不能保证有效利用空间,随着时间的推移,内存块可能会被分配,然后被释放,从而变得支离破碎
  • 您必须管理内存(您负责分配和释放变量)
  • 可以使用realloc()调整变量的大小

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

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

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

好吧,当你进行时

            int x = 10;

编译器执行任何需要执行的操作。但当你使用malloc()时,你负责维护内存块,你可以随心所欲地使用它,这也给了你正确清理它的负担。

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,你应该自己释放内存,否则内存泄漏!

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

int x = 10;

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

我在这里再次为您总结了您从删除的答案中提出的问题:malloc()返回一个原始数据块,它不为任何类型保留。即使你把它分配给一个int左值,数据块也不是int类型的,直到你把它当作those去区分。(意味着你将它与特殊类型的数据一起使用。)你得到的块由解析为Bytes函数的参数来描述。sizeof()表示类型的大小。在这种情况下,你得到了一个块,它有10个整数的位置。但是,如果您还没有将其与int*ptr一起使用,您也可以将地址指定为char类型的指针,并将该块用作40个char变量的内存块。但当你第一次"把东西放进去"时,它就会被保留下来。

最新更新