c语言中栈堆,c语言 栈 堆

kodinid 7 0

大家好,今天小编关注到一个比较意思的话题,就是关于c语言中栈堆的问题,于是小编就整理了4个相关介绍c语言中栈堆的解答,让我们一起看看吧。

  1. c语言栈是什么?
  2. 堆与栈的区别?
  3. C语言中函数调用为什么会出现栈?
  4. String存放在堆中还是栈中?

c语言栈是什么

栈是用来保存数据的,数据形式是先压栈的最后出,最后压栈的最先出栈,就像米缸一样,你先放进去的要最后才能吃,反而最后放进米缸的最先出一样.很多人把堆和栈搞混淆,其实堆是堆,栈是栈,你要煮东西就要壹个锅,而这锅里你可以煮菜饭,或者炒菜一样,你可以把米和菜一起放进去煮,这个锅就是你申请的堆,而煮只是你的代码,要执行功能,执行完了你就把锅给盖上.你开了锅盖,用完了就要你自己去盖上.栈就是米缸,只能放米(保存数据);堆是锅,是你自己向系统申请的空间,用完了要你自己释放..

堆与栈的区别

1 堆和栈是计算机内存存储数据时的两种不同方式。
2 堆是动态分配内存的一种方式,由程序员自己控制内存的申请和释放,其申请的内存大小不固定,可以随时改变。
而栈是由编译器自动分配和释放的,其大小固定,不能随意改变。
3 在使用堆和栈时,需要注意的是,堆需要手动申请和释放内存,如果申请的内存过多或过少都会造成内存泄漏或者内存浪费,而栈则不需要手动管理内存。
同时,在使用函数变量时,函数中的变量是存储在栈中的,而动态分配内存的指针变量则存储在堆中。
堆和栈是程序运行时常用的存储方式,对于程序员来说需要根据实际需求进行选择和使用。

c语言中栈堆,c语言 栈 堆-第1张图片-安济编程网
图片来源网络,侵删)

C语言中函数调用为什么会出现栈?

是不是调用函数的形参过多?

一般来说,函数的参数都存在栈中,当然也可以申请堆。如果形参过多就会发生栈溢出,用递归的时候发生较多。栈溢出会发生段错误,也就是可能会占用系统的栈(好像不能访问)。。。

错了给我说……

c语言中栈堆,c语言 栈 堆-第2张图片-安济编程网
(图片来源网络,侵删)

String存放在堆中还是栈中?

问题中的String指的应该是java中的String吧。这里给出的回答针对Java

String是一个不可变的对象,在j***a中只能作为常量使用。j***a代码中所有的显式字符串,即直接写出的那种字符串,例如"abc"都是String对象。String本身作为一个对象,必然是在堆上的,而String中的内容char[] value 则是放在堆中的一个特殊区域中——常量区。

所以String本身是放在堆上,而根据垃圾回收情况,又可以分为新生代和老年代。如果这个String对象刚创建不久,则它一般位于堆的新生代,如果它创建之后存在了很长时间,则它很可能处于堆中的老年代。注意,String中的字符串内容即字符数组value则位于堆中的常量区。

c语言中栈堆,c语言 栈 堆-第3张图片-安济编程网
(图片来源网络,侵删)

如果你先有一个字符数组,例如char[] arr { 'a', 'b', 'c' },然后调用String s = new String(arr);创建的String,则字符数组不再是位于常量区,而是跟其他对象一样,位于堆上。注意,即使这个arr数组是在栈上分配的,这样创建的String中的value依然是在堆上。如果你想把这个字符串放进常量区,可以调用String.intern。

栈上不会有对象,只会有基本变量和引用变量,所以String只可能位于堆上,不可能位于栈上。

堆和栈是J***a程序在运行过程中的数据存储区,栈是stack,堆是heap。

堆主要用来存储使用new关键字创建的J***a对象和数据,堆中存储的对象和数据都有相应的内存地址值。当堆中存储的对象和数据不再被使用时,J***a的JVM会启动垃圾回收机制,自动清除堆中存储的对象和数据。

栈是用来存储临时数据的,如J***a对象的引用,函数内部的数据和临时对象,函数执行完毕后,存储在栈中的临时数据会立即被释放。

到此,以上就是小编对于c语言中栈堆的问题就介绍到这了,希望介绍关于c语言中栈堆的4点解答对大家有用。

标签: String 对象 数据