文章目录

  • C语言程序的内存组成
  • 变量以及数组开辟内存空间地址大小问题

C语言程序的内存组成

不管对于那种编程语言而言,内存管理都十分重要。对于C语言程序来说,所占用的内存主要有以下几个部分:代码区(所写的C语言的代码以及数据)、静态常量(字符常量)区(定义的字符串常量)、已初始化全局数据区(全局变量被初始化)、未初始化全局数据区、堆区、栈区。
栈区往地址减小方向增长,堆区往地址增大方向增长。
main函数以及自己定义的函数具有临时性,因此在栈上开辟空间,开辟的空间大小由变量的类型所决定。开辟的空间为栈帧。
如下图所示,main函数与swap函数都在栈上开辟空间,但栈是向地址减小的方向增长,因此main函数包括main函数内部所定义的变量地址都比swap函数以及其内部所定义的变量,地址低。

变量以及数组开辟内存空间地址大小问题

以下代码,a、b、c以及数组arr中五个元素地址大小如何排列呢?
没有学习内存分配的知识之前,我会认为a>b>c>arr[0]>arr[1]>…>arr[4],但实际是这样吗?

#include <stdio.h>
#pragma warning(disable:4996)
int main()
{int a = 11;int b = 22;int c = 33;printf("a的地址为:%p\n", &a);printf("b的地址为:%p\n", &b);printf("c的地址为:%p\n", &c);int arr[5] = { 1,2,3,4,5 };int len = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < len; i++){printf("&arr[%d]: %p\n", i, &arr[i]);}
}

从结果可以看到,数组arr的整体内存地址小于a、b、c三个变量的地址,而a、b、c三个变量的地址也是依次减小的。arr数据内部元地址又是依次增加,原因是什么呢?

这是因为栈是由地址高的向地址低的方向开辟空间,因此a、b、c三个变量的地址是依次减小的。而数组arr是先整体开辟空间,数组内部元素在数组整体所开辟的空间内再依次开辟空间,因此,数组是依次增大。

C语言内存分配-附图详解,代码区、常量区、栈区、堆区.......相关推荐

  1. C语言内存管理超详解

    补充: 1.一个正在运行着的C编译程序占用的内存分为栈区.堆区.未初始化数据区(BBS).初始化数据区.代码区5个部分. (1)栈区:存放函数的参数值.局部变量的值.由编译器自动分配释放. (2)堆区 ...

  2. Java虚拟机的垃圾回收器以及内存分配策略详解

    概述 垃圾回收器(GC)是什么以及为什么我们需要垃圾回收器?? 垃圾回收是Java语言区别于其他语言的一种最为重要的特性之一, 通过垃圾回收器(Garbage Collection)来实现对我们Jav ...

  3. 动态内存分配 (详解版)

    文章目录 malloc和free new和delete 1.使用new动态分配内存 2.使用delete释放动态申请的内存 3.使用new申请动态数组 4.不使用或释放已经释放的内存块 常见的动态内存 ...

  4. C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用. 和堆一 ...

  5. C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区...

          栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调 ...

  6. C++——内存分配方式详解

    堆.栈.自由存储区.全局/静态存储区和常量存储区 详见:http://www.cnblogs.com/Azhu/p/4436531.html 明确区分堆与栈 堆与栈的区分问题,似乎是一个永恒的话题,由 ...

  7. 动态内存分配(详解)

    动态内存分配 1.堆内存分配 : C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定 ...

  8. Java垃圾收集器与内存分配策略详解

    垃圾回收 垃圾Java对象的判断-可达性分析算法 从一系列GCRoots作为起始节点,根据引用关系向下搜索,搜索过程所走过的路径称为"引用链"(Reference Chain),没 ...

  9. Elasticsearch内存分配设置详解

    Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了.如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题.   这里有两种方式修改Elast ...

最新文章

  1. 【错误记录】Android Studio Logcat 报错 ( read: unexpected EOF! )
  2. Junos路由器静态路由及动态路由rip和ospf配置测试
  3. 编写登录成功和失败的处理器
  4. WCF trace、log
  5. mysql_connect报告”No such file or directory”错误的解决方法
  6. Building a Console Application on Windows Mobile
  7. 【汇编语言与计算机系统结构笔记09】程序栈,(x86-32)过程调用,栈帧,寄存器使用惯例
  8. android 滑动缩放监听,基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放...
  9. ACL2021最佳论文出炉,来自字节跳动
  10. python基础之面向对象(二)(封装、继承、多态)
  11. 从“流处理”到“流批一体”,Apache Flink 的19个企业最佳实践
  12. 错过现场不要紧,数据智能技术论坛文章、视频大回顾
  13. PCI Express (PCIe) 介绍
  14. 认识CodeSmith
  15. android 软件搬家 换机,手机搬家一键换机
  16. Win10 去掉桌面快捷方式小箭头
  17. html excel2007打开很慢,excel打开很慢,教您Excel表格打开后很卡很慢怎么办
  18. 直观解释Gamma分布和Poisson分布
  19. 你的宽带ip地址被100.64了吗?
  20. 按键精灵文字识别插件_【买三赠一】iOS按键精灵VIP夏季特惠进行中

热门文章

  1. 什么决定你的江湖地位
  2. excel表格拆分多个表如何操作
  3. excel表格拆分成多个工作表
  4. PC和开发板之间传输文件
  5. 器件选型-墨水屏(电子纸)介绍
  6. SpringCloud学习笔记(一)【Euraka集群搭建】
  7. iOS混合开发之uni-app本地打包集成到iOS原生项目
  8. Codeforces Round #829E 1753E. N Machines
  9. 计算机硬盘读取超慢,如何解决电脑硬盘速度慢
  10. Admin.NET管理系统(vue3等前后端分离)学习笔记--持续更新