C语言里,哪些变量是存放在堆里,哪些是存放在栈里?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言里,哪些变量是存放在堆里,哪些是存放在栈里?相关的知识,希望对你有一定的参考价值。

放在堆里的数据是管理员自己开辟空间和释放空间,如,new 和malloc。

而放在栈里的数据时计算机自动分配内存和释放的,如变量。

在c/c++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。


1,栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

2,堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3,自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

4,全局存储区(静态存储区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。

5,常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

参考技术A 堆区:全局变量,静态变量,malloc函数。
栈区:函数的参数值,局部变量。
1、栈区(stack)—
编译器自动分配释放 ,例如存放函数的参数值,局部变量的值等。
2、堆区(heap) —
由程序来分配释放, 若程序中不释放,那么在程序结束时可能由系统进行回收
,例如全局变量,静态变量,malloc函数。

C++ 这些对象是存放在堆里还是栈里? [复制]

【中文标题】C++ 这些对象是存放在堆里还是栈里? [复制]【英文标题】:C++ where these objects are stored heap or stack? [duplicate] 【发布时间】:2021-02-05 21:08:22 【问题描述】:

我写了这段代码,谁能解释在堆和堆栈中创建了多少对象? myStudent 对象是在堆还是堆栈中? 第二个问题,main方法本身和main方法里面的东西是存放在stack里的吗?

class Student

public:
    Student()
    
        id = 0;
    
private:
    int id;
;
Student studentCreator()

    Student* s = new Student();
    return *s;

int main()

    Student myStudent = studentCreator();
    return 0;

【问题讨论】:

您认为它们存储在哪里?你为什么要写这样的代码?不要使用new 和原始拥有指针 C++ 中没有与堆和栈内存相关的内容。 C++ 使用自动存储持续时间和动态存储持续时间。这些实际存储在哪里,C++ 不在乎。 s 在堆栈上,*s 在堆上(因为它从未被释放而被泄露)。 studentCreator() 返回分配给myStudent*s 的副本,该副本位于main 的堆栈帧上。 @NathanOliver "heap" 是用于动态数据的内存区域的常用名称,"stack" 是用于自动数据的内存区域的名称。与同名操作系统段的任何关系纯属巧合。 另外值得注意的是这段代码会泄露内存。无法完成必要的delete,因为分配对象的地址丢失了。 【参考方案1】:

myStudent 在堆栈上。在函数调用期间,您在堆中创建了一些东西并丢失了它的引用。

【讨论】:

将对其进行编辑。 ;) 信不信由你,编译器可以将myStudent 存储在寄存器中,因为它只有一个整数字段。对于大多数处理器,寄存器既不在堆也不在堆栈中。【参考方案2】:

这里你在堆栈上有myStudent,因为该函数在堆上创建了一个学生,但返回它以取消引用它,那么你就有内存泄漏。 main函数由操作系统存储在栈中。

【讨论】:

"主函数存储在栈上" -- 不清楚你说的这些话是什么意思。您的意思是函数main 的实际代码存储在堆栈中(这是错误的)?

以上是关于C语言里,哪些变量是存放在堆里,哪些是存放在栈里?的主要内容,如果未能解决你的问题,请参考以下文章

String类型的对象,是保存在堆里还是在栈里呢?

C语言中定义的静态变量存放在栈区,动态分配的内存空间位于堆区。

变量是放在了堆内存还是栈内存

《转载》什么变量在堆内存里存放,什么变量在栈内存里存放

c语言里啥变量存储在堆中啥变量存储在栈中啊!

数组存放在啥位置?