C语言回顾-内存管理和指针函数
1.fgets()函数
该函数是一个文件操作相关的函数
暂时使用这个函数可以从键盘上接收一个字符串,保存到数组中
char str[50];
1)scanf("%s",str);//缺点:不能接收空格,也是不安全的
2)gets(str);//优点:可以接收空格
//缺点:会有一个警告,不安全的,比如数组的长度是50,我们输入的字符大于等于50的时候,会把50个字符全部放到数组中
//没有空间存放字符串结束符
3)fgets是一个安全的字符串接收函数,比如数组的长度是50,我们输入的字符大于等于50的时候,会把前49个字符全部放到数组中,最后一个位置存放\0
使用格式:char *fgets(char *s,int n,FILE *fp);
fgets(数组名,数组长度,stdin);
当输入的字符串的长度小于数组长度的时候,fgets还会接收回车,回车后才是\0
2.fputs()函数
格式:fputs(数组名,stdout);
不会自动换行,也不能进行格式化输出
puts有换行
- //
- // main.c
- // Fgets
- //
- // Created by fanyafang on 15/11/5.
- // Copyright © 2015年 itcast. All rights reserved.
- //
- #include <stdio.h>
- #include <string.h>
- int main(int argc, const char * argv[]) {
- char str[];
- fgets(str,sizeof(str),stdin);
- //把字符串后面的\n改为\0
- //if(str[strlen(str)-1]=='\n') str[strlen(str)-1]='\0';
- printf("---->%s\n",str);
- puts(str);//有换行
- fputs(str,stdout);//无换行
- return ;
- }
3.const类型修饰符
常类型是指使用类型修饰符const说明的类型,常类型的变量或者对象的值是不能被更新的
1)修饰变量可以让变量的值不能改变
2)修饰指针变量,const在*的左侧,那么变量值不能改变;如果在* 的右侧,表示指向不能改变;如果在* 的两侧,表示两个都不能变
- //
- // main.c
- // const使用
- //
- // Created by fanyafang on 15/11/5.
- // Copyright © 2015年 itcast. All rights reserved.
- //
- #include <stdio.h>
- int main(int argc, const char * argv[]) {
- //1)修饰变量
- const int a=;
- printf("%d\n",a);
- //a=34;报错,不能修改
- //2)用指针强制修改变量
- int *p=&a;
- *p=;
- printf("%d\n",a);//值不一样
- printf("%d\n",*p);
- printf("%p\n",&a);//地址一样
- printf("%p\n",p);
- //3)修饰指针变量,指向可以改变,指向的值不可以改变
- int b=;
- const int *p1=&a;
- p1=&b;
- int const *p6=&a;
- p1=&b;
- //4)const修饰的指针变量,指针变量指向的变量值可以变,指向不能变
- int * const p3=&a;
- *p3=;//指向的值可以变
- //ps=&b;报错,指向不能变
- //5)const修饰的指针变量,变量值和指向都不能变
- const int * const p4=&a;
- //*p4=12000;
- //p4=&b;
- return ;
- }
3.内存管理
1)内存分配方式
1))静态分配,在程序编译的适合就已经分配好,这块内存在程序的整个运行期都存在,例如全局变量,static变量
2))在栈上创建,在执行函数时,函数内局部变量的存储单元,效率很高,容量有限
3))从堆上分配,议程动态内存分配,程序在运行的时候用malloc或new申请任意多少的内存,手动用free或delete释放内存,灵活
2)内存分区
栈:运行时分配,局部变量
堆:运行时分配
BSS段:编译时分配,未初始化的全局变量和静态变量
数据区:编译时分配,已经初始化的全局变量和静态变量
代码段:编译时分配
3)动态分配内存函数:
1))viod * malloc(unsigned size);
#include <stdlib.h>
从内存的堆区分配大小为size个字节的联系的内存空间,如果内存分配成功,返回内存的首地址,失败,返回NULL。所以需要判断是否分配成功
2))calloc分配
calloc(块数,长度);
3))realloc函数可以给已经存在的空间扩充大小,返回新的地址
- //
- // main.c
- // 分配内存
- //
- // Created by fanyafang on 15/11/5.
- // Copyright © 2015年 itcast. All rights reserved.
- //
- #include <stdio.h>
- #include <stdlib.h>
- int main(int argc, const char * argv[]) {
- //分配空间
- //int *p=(int *)malloc(4*sizeof(int));
- //使用一个函数给malloc申请的空间进行初始化
- //memset(p,'a',16);
- int *p=(int *)calloc(, );//可以自动初始化
- p=realloc(p, *sizeof(int));
- if(p==NULL){
- printf("申请失败!");
- }else{
- printf("申请成功!");
- printf("%d\n",*p);
- *p=;
- *(p+)=;
- *(p+)=;
- *(p+)=;
- *(p+)=;
- printf("%d\n",*(p+));
- }
- return ;
- }
4.野指针和内存泄露
int *p=(int *)calloc(4, 4);//p存储在栈区,p指向的内容在堆区
在p被释放之前先要释放堆区中的内容,否则会造成内存泄露,释放之后要赋值为NULL,不然还是可以访问
- //应该使用free函数释放内存空间
- free(p);//释放后p是一个野指针
- //p=NULL;
- *p=;
5.指针函数:返回值是指针类型的函数
- //
- // main.c
- // 指针函数
- //
- // Created by fanyafang on 15/11/5.
- // Copyright © 2015年 itcast. All rights reserved.
- //
- #include <stdio.h>
- char * printDay(int n){
- char * days[]={
- "星期一",
- "星期二",
- "星期三",
- "星期四",
- "星期五",
- "星期六",
- "星期日"
- };
- return n>&&n<?days[n-]:"输入错误";
- }
- int main(int argc, const char * argv[]) {
- int n=;
- printf("请输入一个数字:\n");
- scanf("%d",&n);
- printf("%s\n",printDay(n));
- return ;
- }
6.函数指针
在C语言中,一个函数总是占用一段连续的内存空间,而函数名就是该函数所占内存空间区的首地址
定义函数指针:int (*p)(int a , int b );或者:int (*p)(int , int );
函数指针的使用:
调用函数,同函数名的使用,可以任意调用函数
C语言回顾-内存管理和指针函数的更多相关文章
- C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...
- JVM内存管理------JAVA语言的内存管理概述
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...
- JVM内存管理之JAVA语言的内存管理概述
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...
- C语言的内存管理
C语言的内存管理 转载:http://blog.csdn.net/wind19/article/details/5964090 对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text ...
- R语言之内存管理
转载于:http://blog.csdn.net/hubifeng/article/details/41113789 在处理大型数据过程中,R语言的内存管理就显得十分重要,以下介绍几种常用的处理方法. ...
- C语言讲义——内存管理
动态分配内存 动态分配内存,在堆(heap)中分配. void *malloc(unsigned int num_bytes); 头文件 stdlib.h或malloc.h 向系统申请分配size个字 ...
- C#高级编程9 第14章 内存管理和指针
C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...
- c语言之内存管理
在计算机系统,特别是嵌入式系统中,内存资源是非常有限的.尤其对于移动端开发者来说,硬件资源的限制使得其在程序设计中首要考虑的问题就是如何有效地管理内存资源.本文是作者在学习C语言内存管理的过程中做的一 ...
- C语言精华——内存管理,很多学校学习不到的知识~
在编写程序时,通常并不知道需要处理的数据量,或者难以评估所需处理数据量的变动程度.在这种情况下,要达到有效的资源利用--使用内存管理,必须在运行时动态地分配所需内存,并在使用完毕后尽早释放不需要的内存 ...
随机推荐
- NOSQL场景梳理
Redis 场景:缓存,Session,消息发布订阅,产品属性分析,订单购买等强事务,计数等 Memcached 场景:读密集,写一般的缓存,Session MongoDB 场景:数据显示,查 ...
- JavaScript字符串的操作-课堂笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Lua数据持久化
1.数据文件 我们可以利用Lua中的table构造式来定义一种文件格式,即文件中的数据是table构造并初始化的代码 ,这种方式对于Lua程序而言是非常方便和清晰的,如: Entry{" ...
- MySQL Replication需要注意的问题
MySQL Replication 大家都非常熟悉了,我也不会写怎么搭建以及复制的原理,网上相关文章非常多,大家可以自己去搜寻.我在这里就是想总结一下mysql主从复制需要注意的地方.有人说主从复制很 ...
- context上下文 php版解释
context翻译为上下文其实不是很好,只是翻译理解大概的作用,对于开发来说,context是对定义的使用的变量,常量或者说是配置, 部分的函数功能除了缺省值之外,往往需要手动设置一些定义量来配合当前 ...
- Eclipse修改编码格式
♣修改工作空间默认编码 ♣修改文件的编码 ♣修改某文件类型的编码 ♣修改JSP文件类型的编码 1.修改工作空间默认编码 window -> preferences -> General ...
- java 性能优化(代码优化)
参考博文: java 性能优化:35 个小细节,让你提升 java 代码的运行效率
- 带你玩转JavaWeb开发之六-mysql基本语法详解及实例(4)
按照分类的名称统计每个分类商品所花的总钱数[排序查询] SQL中对查询的列进行排序,使用关键字order by.默认情况下是升序的排序(从小到大的排序顺序关键字 asc).使用降序排序需要使用关键字d ...
- freebsd 系统时间
http://blog.csdn.net/wowoto/article/details/5557810 https://www.douban.com/note/150233427/ date #查看当 ...
- sublime text3配置node.js开发环境
今天配置sublime下node.js网上搜索很多方法. 首先:传统的方法是 1.GIT方法 可直接输入 Git clone https://github.com/tanepiper/SublimeT ...