C语言内存分配-附图详解,代码区、常量区、栈区、堆区.......
文章目录
- 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语言内存分配-附图详解,代码区、常量区、栈区、堆区.......相关推荐
- C语言内存管理超详解
补充: 1.一个正在运行着的C编译程序占用的内存分为栈区.堆区.未初始化数据区(BBS).初始化数据区.代码区5个部分. (1)栈区:存放函数的参数值.局部变量的值.由编译器自动分配释放. (2)堆区 ...
- Java虚拟机的垃圾回收器以及内存分配策略详解
概述 垃圾回收器(GC)是什么以及为什么我们需要垃圾回收器?? 垃圾回收是Java语言区别于其他语言的一种最为重要的特性之一, 通过垃圾回收器(Garbage Collection)来实现对我们Jav ...
- 动态内存分配 (详解版)
文章目录 malloc和free new和delete 1.使用new动态分配内存 2.使用delete释放动态申请的内存 3.使用new申请动态数组 4.不使用或释放已经释放的内存块 常见的动态内存 ...
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用. 和堆一 ...
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区...
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调 ...
- C++——内存分配方式详解
堆.栈.自由存储区.全局/静态存储区和常量存储区 详见:http://www.cnblogs.com/Azhu/p/4436531.html 明确区分堆与栈 堆与栈的区分问题,似乎是一个永恒的话题,由 ...
- 动态内存分配(详解)
动态内存分配 1.堆内存分配 : C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定 ...
- Java垃圾收集器与内存分配策略详解
垃圾回收 垃圾Java对象的判断-可达性分析算法 从一系列GCRoots作为起始节点,根据引用关系向下搜索,搜索过程所走过的路径称为"引用链"(Reference Chain),没 ...
- Elasticsearch内存分配设置详解
Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了.如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题. 这里有两种方式修改Elast ...
最新文章
- 【错误记录】Android Studio Logcat 报错 ( read: unexpected EOF! )
- Junos路由器静态路由及动态路由rip和ospf配置测试
- 编写登录成功和失败的处理器
- WCF trace、log
- mysql_connect报告”No such file or directory”错误的解决方法
- Building a Console Application on Windows Mobile
- 【汇编语言与计算机系统结构笔记09】程序栈,(x86-32)过程调用,栈帧,寄存器使用惯例
- android 滑动缩放监听,基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放...
- ACL2021最佳论文出炉,来自字节跳动
- python基础之面向对象(二)(封装、继承、多态)
- 从“流处理”到“流批一体”,Apache Flink 的19个企业最佳实践
- 错过现场不要紧,数据智能技术论坛文章、视频大回顾
- PCI Express (PCIe) 介绍
- 认识CodeSmith
- android 软件搬家 换机,手机搬家一键换机
- Win10 去掉桌面快捷方式小箭头
- html excel2007打开很慢,excel打开很慢,教您Excel表格打开后很卡很慢怎么办
- 直观解释Gamma分布和Poisson分布
- 你的宽带ip地址被100.64了吗?
- 按键精灵文字识别插件_【买三赠一】iOS按键精灵VIP夏季特惠进行中