c语言内存分配与释放 不同类别变量的内存分配和释放的区别
1.不同变量使用内存的区别
- 静态存储类别的变量:内存数量在编译时确定,程序开始执行时创建,程序结束时销毁。(static、const)
- 自动存储类别的变量:程序进入变量定义所在块时存在,离开块时销毁。新创建的变量按顺序加入内存,然后以相反的顺序销毁,类似栈。
- 动态分配内存的变量:内存在调用malloc()或相关函数时存在,调用free()后释放内存。
- 程序把静态对象、自动对象、动态分配的对象存储在不同的区域。
2.为什么要动态分配内存
大多数情况程序使用的数组小于100个元素,但有时程序需要100000个元素,如果直接声明一个内含100000个元素的数组,这样做浪费内存。
所以通过动态分配内存,使程序更加灵活
3.free在动态内存分配的作用——防止内存泄漏
double *a =(double*)malloc(n*sizeof(double))
函数结束,作为自动变量的指针a消失,但他指向的n*sizeof(double)字节的内存仍然存在,而且由于指针a已经被销毁,所以无法访问这块内存,这块内存也不能被重复使用。
所以需要用free释放动态分配的内存
4.free和malloc用法
free和malloc原型都在stdlib.h头文件中
malloc()返回类型通常为指向char的指针,从ANSI C标准开始,C使用一个新的类型,指向void的指针。所以通常malloc函数的返回值会被强制转换为匹配的类型。
double *p;
p=(double *)malloc(30*sizeof(double));
指针p被声明为指向一个double类型,可以像使用数组名一样使用它,这里分配的是连续的内存块,指针指向已分配块中的第一个结构。
free()函数的参数是之前malloc()返回的地址,因此参数也应是一个指针。该函数释放之前malloc()分配的内存。
free(p);
5.例子-通讯录排序
习题9-5 通讯录排序 (20 分)
输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。
输入格式:
输入第一行给出正整数n(<10)。随后n行,每行按照“姓名 生日 电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文字母组成的字符串,“生日”是yyyymmdd格式的日期,“电话号码”是不超过17位的数字及+、-组成的字符串。
输出格式:
按照年龄从大到小输出朋友的信息,格式同输出。
输入样例:
3
zhang 19850403 13912345678
wang 19821020 +86-0571-88018448
qian 19840619 13609876543
结尾无空行
输出样例:
wang 19821020 +86-0571-88018448
qian 19840619 13609876543
zhang 19850403 13912345678
结尾无空行
5.1代码
#include<stdio.h>
#include<stdlib.h>
struct people{char name[11];long long birth;char phonenum[20];
};int main(){struct people *p,temp;int n,i,j;scanf("%d",&n);p=(struct people *)malloc(n*sizeof(struct people));//分配空间for(i=0;i<n;++i){scanf("%s %lld %s",&p[i].name,&p[i].birth,&p[i].phonenum);}for(i=0;i<n;++i){for(j=i+1;j<n;++j){if(p[i].birth>p[j].birth){//排序temp=p[i];p[i]=p[j];p[j]=temp;}}}for(i=0;i<n;++i){if(i==0)printf("%s %lld %s",p[i].name,p[i].birth,p[i].phonenum);else printf("\n%s %lld %s",p[i].name,p[i].birth,p[i].phonenum);}free(p);//释放
}
c语言内存分配与释放 不同类别变量的内存分配和释放的区别相关推荐
- java 内存分布_java的各类型数据在内存中分配情况详解_
1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但掌握Jav ...
- 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...
- 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )
文章目录 一.二级指针 1.为 二维指针 分配内存 2.为每个 一维指针 分配内存 3.释放 二维指针 内存 二.完整代码示例 一.二级指针 声明二级指针 : // 声明二维指针char **p = ...
- C语言的变量的内存分配
今晚看了人家写的一个关于C语言内存分配的帖子,发现真是自己想找的,于是乎就收藏了... 先看一下两段代码: char* toStr() {char *s = "abcdefghijkl&qu ...
- C/C++语言变量声明内存分配
[cpp] view plaincopy <span style="font-family: Verdana, Arial, Helvetica, sans-serif; " ...
- CUDA内存分配、释放、传输,固定内存
/** 内存分配* if failed, return cudaErrorMemoryAllocation */cudaError_t cudaMalloc(void **devPtr, size_t ...
- 如何释放指针又不影响内存数据_C# 内存机制 - 基础篇
腾讯面前端暑期实习还有一道让我有点窒息的题目,当时好像是问我C#内存分块底层?我有点不大懂面试官的意思.所以干脆一起总结一下免得无话可说. 1 Overview 首先开宗明义,C#是一种托管语言,它的 ...
- linux为系统分配内存,Linux操作系统知识讲解:走进Linux 内存分配算法
Linux 内存分配算法 内存管理算法--对讨厌自己管理内存的人来说是天赐的礼物 1.内存碎片 1) 基本原理 产生原因:内存分配较小,并且分配的这些小的内存生存周期又较长,反复申请后将产生内存碎片的 ...
- 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )
文章目录 一.二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) 二.完整代码示例 一.二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) 在上一篇博客 [C 语言]二 ...
最新文章
- Caffe学习系列(5):其它常用层及参数
- windows编程,消息函数中拦截消息的问题
- 【自然框架】之通用权限(四):角色表组
- BluePrint和ORM
- autowired_@Autowired所有的东西!
- 字符,字符串,int之间互相转换
- [转载]我的PMP复习备考经验谈(下篇)——一本关于PMP备考的小指南
- SAP License:SAP学习笔记
- angular NG-ZORRO 跑马灯左右控件
- 经典C语言学习教程资料
- 人工智能的主要研究领域
- 7月30日PMP考试注意事项
- iphone6出信号 无服务器,苹果6手机无服务(非常见故障点)维修
- 中兴捧月——婚姻匹配问题
- PHP icbc工商银行开放平台聚合支付,二维码扫码支付对接步骤
- Centos 7.6 Install shc
- 论文查重系统如何才安全?
- 平流式隔油池计算_隔油池设计方案计算.doc
- APT对传统反病毒技术的威胁和我们的应对尝试
- BZOJ 3772 精神污染 可持久化线段树
热门文章
- elf文件格式实例解析
- k3 审核流程图_3-金蝶K3操作流程图详解
- 安卓手机备份_安卓手机数据备份与恢复方法汇总和操作详解
- python图形化编程工具哪个好_mPython(图形化编程软件) V0.5.0 官方版
- 太原市中考计算机考试系统,太原中考报名系统
- 邮票的孔怎么做出来的_金银花茶是怎么做出来的呢
- electron打包vue-cli4项目的解决方案1(项目实测)
- IntelliJ IDEA中的神仙插件
- spring aop 中@annotation()和自定义注解的使用
- linux概述、基本命令