热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言:变量、函数的属性及其内存区域

文章目录变量、函数的属性内存区域1栈stackconst修饰的变量const修饰的指针2堆heap3全局(静态)变量区4常量区5代码段内存区域图解堆、栈和内存区域映射图解变量、函数


文章目录

  • 变量、函数的属性
  • 内存区域
    • 1 栈stack
      • const修饰的变量
      • const修饰的指针
    • 2 堆heap
    • 3 全局(静态)变量区
    • 4 常量区
    • 5 代码段
  • 内存区域图解
  • 堆、栈和内存区域映射图解




变量、函数的属性

在这里插入图片描述


内存区域


1 栈stack


  • (默认1M,大小可修改)内存1024*512,系统自主管理
    栈顶位于低地址,栈底位于高地址,即所谓的向下生长。
    连续分配内存,先进后出。
    数组和字符串在栈中按整体储存,此时尾部位于高地址。

如,数组{1,2,3,4,5}
在栈中从上(栈底)往下(栈顶)按5,4,3,2,1排列,
即:其尾部5位于高地址,头部1位于低地址




int arr = { 1,2,3,4,5 };
int* p = arr;

在这里插入图片描述



int a = 100;
char str[] = "hello";
char* p = str;

栈底位于高地址,向下生长
a 先进栈,位于栈底,地址最高
然后是字符串的’\0’ ~ ‘h’,地址依次降低。


在这里插入图片描述




const修饰的变量


  • 其值位于栈中,是重新分配的内存
  • 链接属性:内部的,无法使用extern强制引用

char p[] = "blue";
const char p1[] = "blue";
const char p2[] = "blue";printf("%p %p %p\n", &p,&p1,&p2);//三个地址不相同

const修饰的指针


  • 其指向的数据是位于常量区的,内存地址不发生改变

const char* p3 = "blue";
const char* p4 = "blue";printf("%p %p\n", p3,p4);//两个地址相同

2 堆heap


  • 内存几乎接近物理内存,外部自行管理,
    malloc()创建的动态内存位于该区域
    堆顶位于高地址,堆底位于低地址,即所谓的向上生长。

3 全局(静态)变量区


  • 包含所有静态变量(静态全局变量,静态局部变量)和全局变量

全局变量:函数外部定义的变量
局部变量:函数内部定义的变量



4 常量区


  • 包含字符常量,数字常量,const全局变量

5 代码段




内存区域图解

在这里插入图片描述


堆、栈和内存区域映射图解

int* stack = (int*)malloc(4 * sizeof(int));
int top = 0;
stack[top++] = 0;//stack[0] = 0,top = 1
stack[top++] = 1;//stack[1] = 1,top = 2
stack[top++] = 2;//stack[2] = 2,top = 3
stack[top++] = 3;//stack[3] = 3,top = 4
int a = stack[--top];//a = stack[3],top = 3
int b = stack[--top];//b = stack[2],top = 2
int c = stack[--top];//a = stack[1],top = 1
int d = stack[--top];//a = stack[0],top = 0

注意堆内存空间的大小,避免溢出!!


在这里插入图片描述


推荐阅读
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
author-avatar
书友67696238
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有