1.不同变量使用内存的区别

  1. 静态存储类别的变量:内存数量在编译时确定,程序开始执行时创建,程序结束时销毁。(static、const)
  2. 自动存储类别的变量:程序进入变量定义所在块时存在,离开块时销毁。新创建的变量按顺序加入内存,然后以相反的顺序销毁,类似栈。
  3. 动态分配内存的变量:内存在调用malloc()或相关函数时存在,调用free()后释放内存。
  4. 程序把静态对象、自动对象、动态分配的对象存储在不同的区域。

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语言内存分配与释放 不同类别变量的内存分配和释放的区别相关推荐

  1. java 内存分布_java的各类型数据在内存中分配情况详解_

    1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但掌握Jav ...

  2. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  3. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

    文章目录 一.二级指针 1.为 二维指针 分配内存 2.为每个 一维指针 分配内存 3.释放 二维指针 内存 二.完整代码示例 一.二级指针 声明二级指针 : // 声明二维指针char **p = ...

  4. C语言的变量的内存分配

    今晚看了人家写的一个关于C语言内存分配的帖子,发现真是自己想找的,于是乎就收藏了... 先看一下两段代码: char* toStr() {char *s = "abcdefghijkl&qu ...

  5. C/C++语言变量声明内存分配

    [cpp] view plaincopy <span style="font-family: Verdana, Arial, Helvetica, sans-serif; " ...

  6. CUDA内存分配、释放、传输,固定内存

    /** 内存分配* if failed, return cudaErrorMemoryAllocation */cudaError_t cudaMalloc(void **devPtr, size_t ...

  7. 如何释放指针又不影响内存数据_C# 内存机制 - 基础篇

    腾讯面前端暑期实习还有一道让我有点窒息的题目,当时好像是问我C#内存分块底层?我有点不大懂面试官的意思.所以干脆一起总结一下免得无话可说. 1 Overview 首先开宗明义,C#是一种托管语言,它的 ...

  8. linux为系统分配内存,Linux操作系统知识讲解:走进Linux 内存分配算法

    Linux 内存分配算法 内存管理算法--对讨厌自己管理内存的人来说是天赐的礼物 1.内存碎片 1) 基本原理 产生原因:内存分配较小,并且分配的这些小的内存生存周期又较长,反复申请后将产生内存碎片的 ...

  9. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )

    文章目录 一.二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) 二.完整代码示例 一.二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) 在上一篇博客 [C 语言]二 ...

最新文章

  1. Caffe学习系列(5):其它常用层及参数
  2. windows编程,消息函数中拦截消息的问题
  3. 【自然框架】之通用权限(四):角色表组
  4. BluePrint和ORM
  5. autowired_@Autowired所有的东西!
  6. 字符,字符串,int之间互相转换
  7. [转载]我的PMP复习备考经验谈(下篇)——一本关于PMP备考的小指南
  8. SAP License:SAP学习笔记
  9. angular NG-ZORRO 跑马灯左右控件
  10. 经典C语言学习教程资料
  11. 人工智能的主要研究领域
  12. 7月30日PMP考试注意事项
  13. iphone6出信号 无服务器,苹果6手机无服务(非常见故障点)维修
  14. 中兴捧月——婚姻匹配问题
  15. PHP icbc工商银行开放平台聚合支付,二维码扫码支付对接步骤
  16. Centos 7.6 Install shc
  17. 论文查重系统如何才安全?
  18. 平流式隔油池计算_隔油池设计方案计算.doc
  19. APT对传统反病毒技术的威胁和我们的应对尝试
  20. BZOJ 3772 精神污染 可持久化线段树

热门文章

  1. elf文件格式实例解析
  2. k3 审核流程图_3-金蝶K3操作流程图详解
  3. 安卓手机备份_安卓手机数据备份与恢复方法汇总和操作详解
  4. python图形化编程工具哪个好_mPython(图形化编程软件) V0.5.0 官方版
  5. 太原市中考计算机考试系统,太原中考报名系统
  6. 邮票的孔怎么做出来的_金银花茶是怎么做出来的呢
  7. electron打包vue-cli4项目的解决方案1(项目实测)
  8. IntelliJ IDEA中的神仙插件
  9. spring aop 中@annotation()和自定义注解的使用
  10. linux概述、基本命令