C语言之内存
#include <stdio.h>
#include <string.h>
int a = ; //全局初始化区
char *p1; //全局未初始化区
int main()
{
/*************************************************************
* C语言变量声明及内存分配
*
* 一个由C/C++编译的程序占用的内存分为以下几个部分
*
* 1、栈区(stack)
* 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。
* 其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。
*
* 2、堆区(heap)
* 在内存开辟另一块存储区域。一般由程序员分配释放,若程序员不释放,
* 程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方
* 式倒是类似于链表。
*
* 3、全局区(静态区)(static)
* 编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的,
* 初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初
* 始化的静态变量在相邻的另一块区域(BSS)。程序结束后由系统释放
*
* 4、文字常量区:
* 常量字符串就是放在这里的,程序结束后由系统释放。
*
* 5、程序代码区:
* 存放函数体的二进制代码。
*
* 内存分配方式:
* 内存分配方式有三种:
* 1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在
* 程序的整个运行期间都存在。例如全局变量,static变量。
*
* 2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,
* 函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的
* 指令集中,效率很高,但是分配的内存容量有限。
*
* 3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new
* 申请任意多少的内存,程序员自己负责在何时用free或delete释放内
* 存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了
* 空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释
* 放不同大小的堆空间将会产生堆内碎块。
*************************************************************/
int b=; // 栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = ""; //"123456\0"在常量区,p3在栈上。
static int c =; // 全局(静态)初始化区
p2 = (char *)malloc(); //分配得来的20字节的区域就在堆区。
//123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方
strcpy(p1, "");
free(p2);
system("pause");
return ;
}
C语言之内存的更多相关文章
- C语言中内存的申请函数
C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等. alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且 ...
- JVM内存管理------JAVA语言的内存管理概述
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...
- 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域
[源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...
- c语言之内存的申请malloc() 和释放free()
c语言之内存的申请malloc() 和释放free() 1.如何使用 malloc 函数 malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要几个要求: 内存分配给谁?分配多大内存 ...
- C语言的内存管理
C语言的内存管理 转载:http://blog.csdn.net/wind19/article/details/5964090 对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text ...
- (十一)C语言中内存堆和栈的区别
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...
- C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...
- C语言中内存分配 (转)
在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...
- 【转】C语言中内存分配
原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...
- C语言程序内存布局
C语言程序内存布局 如有转载,请注明出处:http://blog.csdn.net/embedded_sky/article/details/44457453 作者:super_bert@csdn 一 ...
随机推荐
- Python列表推导式中使用if-else
data_list=[] col=["a", "b", "c", "d"] jdata={"a":1 ...
- idea部署tomcat项目时,在项目里打断点不能拦截
以下内容都是基于我自己的项目(如未解决道友们的问题,请别介意) idea部署tomcat项目时,在项目里打断点不能拦截,工作中遇到的问题,记录一下(tomcat6) 当项目的以下内容配置完毕后,启动项 ...
- Process Array
http://xiaorui.cc/2016/05/10/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90multiprocessing%E7%9A%84value-array ...
- spring基于xml的事务控制
opm配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http: ...
- c# DataTable join 两表连接
转:https://www.cnblogs.com/xuxiaona/p/4000344.html JlrInfodt和dtsource是两个datatable,通过[姓名]和[lqry]进行关联 v ...
- [转载]图文详解YUV420数据格式
原博主的博客为:https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html YUV格式有两大类:planar和packed.对于p ...
- PHP水仙花数的实现
php水仙花数是什么? 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153)三位的水仙花数共有4个:153,3 ...
- 关系型数据库---MYSQL---系统学习
1.概述 1.1 mysql数据库是一种 客户端/服务器体系 的 数据库系统: 服务器部分 在启动运行后没有人机界面,所以终端用户 无法直接使用MySQL: 对MySQL数据库进行访问.操作 ...
- 一维条码Code 128 类型的 A、B、C及Auto的区别
CODE 128条码是1981年由COMPUTER IDENTICS公司开发的.对128个字符进行标准化的多级别编码.其条码的字符与其表示的数据呈1对1的关系,特点是通过起始字符.代码集字符.转换字符 ...
- Java——接口interface
3.5接口interface ①有时必须从几个类中派生出一个子类,继承它们所有的属性和方法.但是,Java不支持多重继承.有了接口,就可以得到多重继承的效果. ②接口(interface)是抽象方法和 ...