在Ubuntu下对c语言全局变量、局部变量、堆、栈等详解

本文详细介绍了C/C++程序内存的各个区域,包括栈区、堆区、常数区、静态区和代码区。全局变量和局部变量分别存储在全局数据区和栈中,静态变量也有其特定的存储位置。栈遵循先进后出的原则,用于存放自动变量和函数调用,而堆提供更大的内存空间,但管理更为复杂。在Ubuntu环境下,通过查看内存地址可以进一步理解这些概念。
摘要由CSDN通过智能技术生成

C/C++程序内存的各种变量存储区域和各个区域详解

C语言在内存中一共分为如下几个区域,分别是:

  1. 内存栈区: 存放局部变量名;
  2. 内存堆区: 存放new或者malloc出来的对象;
  3. 常数区: 存放局部变量或者全局变量的值;
  4. 静态区: 用于存放全局变量或者静态变量;
  5. 代码区:二进制代码。

全局变量、静态局部变量保存在全局数据区,初始化的和未初始化的分别保存在一起;
普通局部变量保存在堆栈中;

全局变量与局部变量

全局变量(Global Variable):定义:所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件。
局部变量(Local Variable):定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。再调用就是出错。
常见问题

  • 在main函数中定义的变量也是局部变量,只能在main函数中使用;同时,main函数中也不能使用其他函数中定义的变量。main函数也是一个函数,与其它函数地位平等。
    -形参变量、在函数体内定义的变量都是局部变量,实参给形参传值的过程也就是给局部变量赋值的过程。
    -可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互补干扰,也不会发生混乱。
    -在语句块(由一对{}包含的若干条语句)中也可以定义变量,它的作用域只限于当前的语句块。

堆栈

堆和栈都是动态分配内存,两者空间大小都是可变的。
Stack: ,存放Automatic Variables,按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。栈是用于存放临时变量和函数调用的。栈也是一种先进后出的数据结构,函数的递归调用正得益于栈的存在。需注意存在栈的数据只在当前函数和子函数中有效,一旦函数返回数据将会被自动释放。
Heap: ,自由申请的空间,按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。 每个线程都会有自己的栈,但是堆空间是共用的。堆的使用周期有使用者控制,程序中的内存泄漏多因程序员对堆的管理不当引起,需谨慎。

局部变量、全局变量、静态变量、堆、栈的内存地址

1、ubuntu中创建一个源文件(vim 名字)


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
void before()
{
   
 
}
 
char g_buf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值