This commit is contained in:
许大仙 2024-10-16 10:02:08 +08:00
parent cb44321003
commit 8557782327

View File

@ -2051,7 +2051,7 @@ int main()
>
> - ① 程序代码区、常量区、全局数据区在程序加载到内存后就分配好了,并且在程序运行期间一直存在,不能销毁也不能增加(大小已被固定),只能等到程序运行结束后由操作系统收回,所以全局变量、字符串常量等在程序的任何地方都能访问,因为它们的内存一直都在。
> - ② 函数被调用时,会将参数、局部变量、返回地址等与函数相关的信息压入栈中,函数执行结束后,这些信息都将被销毁。所以局部变量、参数只在当前函数中有效,不能传递到函数外部,因为它们的内存不在了。
> - ③ 常量区、全局数据区、栈上的内存由系统自动分配和释放不能由程序员控制。程序员唯一能控制的内存区域就是堆Heap它是一块巨大的内存空间常常占据整个虚拟空间的绝大部分在这片空间中程序可以申请一块内存并自由地使用放入任何数据。堆内存在程序主动释放之前会一直存在不随函数的结束而失效。在函数内部产生的数据只要放到堆中就可以在函数外部使用。
> - ③ 常量区、全局数据区、栈上的内存由系统自动分配和释放,不能由程序员控制。程序员唯一能控制的内存区域就是``Heap它是一块巨大的内存空间常常占据整个虚拟空间的绝大部分在这片空间中程序可以申请一块内存并自由地使用放入任何数据。堆内存在程序主动释放之前会一直存在不随函数的结束而失效。在函数内部产生的数据只要放到堆中就可以在函数外部使用。
## 7.2 C 语言中的数组
@ -2075,7 +2075,7 @@ int main() {
>
> * ① 栈内存的大小和编译器有关,编译器会为栈内存制定一个最大值。
> * ② 在 VS 中,默认是 1 MB在 GCC 下,默认是 8 MB。
> * ③ 虽然可以通过参数来修改栈内存的大小;但是,在实际开发中,我们一般不会这么做。
> * ③ 虽然可以通过参数来修改栈内存的大小;但是,在实际开发中,我们一般不会这么做。
* 所以,在实际开发中,如果我们要使用数组,就需要在`堆`中开辟内存空间,因为堆中的内存空间是可以动态扩容和缩容的,只不多在 C 语言中对于堆中申请的内存空间,需要程序员在用完之后,手动释放掉;否则,将会造成内存泄漏现象。
@ -2128,5 +2128,5 @@ public class Test {
>
> * ① 在 Java 语言中,数组的内存分配是由 JVMJava Virtual MachineJava 虚拟机)自动管理的,开发者不需要像在 C 语言中那样手动调用 `malloc` 来申请内存。Java 提供了更加高级的内存管理机制,所有数组在堆中动态分配。
> * ② 在 Java 中声明和初始化数组的过程本质上就是在堆内存中分配数组内存的过程。每个数组在创建时都会被分配到堆中并且由垃圾回收机制Garbage CollectorGC自动负责内存的回收。
> * ③ 我们甚至可以理解为Java 语言是 C 语言的最佳实践版本。
> * ③ 我们甚至可以理解为Java 语言是 C 语言在实际开发过程中的最佳实践版本。