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);//释放
}