深圳网站的优化,wordpress 特色 外链,福州网站制作维护,软文范文1.不同变量使用内存的区别
静态存储类别的变量#xff1a;内存数量在编译时确定#xff0c;程序开始执行时创建#xff0c;程序结束时销毁。(static、const)自动存储类别的变量#xff1a;程序进入变量定义所在块时存在#xff0c;离开块时销毁。新创建的变量按顺序加入内…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个朋友的信息包括姓名、生日、电话号码本题要求编写程序按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。
输入格式: 输入第一行给出正整数n10。随后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代码
#includestdio.h
#includestdlib.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(i0;in;i){scanf(%s %lld %s,p[i].name,p[i].birth,p[i].phonenum);}for(i0;in;i){for(ji1;jn;j){if(p[i].birthp[j].birth){//排序tempp[i];p[i]p[j];p[j]temp;}}}for(i0;in;i){if(i0)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);//释放
}