C语言第九章:内存管理

来源:互联网 发布:知乎 万历郑贵妃 编辑:程序博客网 时间:2024/06/01 23:24

一、 二维字符数组
1、 用二维的字符数组存储多个字符串
1)、第一维存的是每个字符串的首地址
2)、每个字符串的长度不能超过第二维长度
2、 它就是一个二维数组。
二、 char类型的指针数组
1、格式:char *name[]={“weqw ”.”ffg”};
三、练习字符串排序(输入字符串)

四、fgets()函数的使用
1、fgets的作用:该函数 是一个文件操作相关的函数,暂时使用它可以从键盘上行接收一个字符串保存到数组中。
I、前面使用字符串保存的方法:
Char str[50] ;
scanf(”%s ”,str );//缺点就是不能接收空格,不安全
gets(str) //优点:可以接收空格,只要不遇到换行就可以继续存。
//缺点内存的溢出不安全
ii、fgets()函数是一个安全的字符串接收函数
char s[5]; fgets(s,sizeof(s),stdin);//这个长度是严格按照字符串的形式存放的。把最后的一个元素变成\0.
Iii、当输入的字符串少于定义的长度时,fgets还会接收回车
fget的缺点,不能格式化输入

fputs ()的缺点 不自动换行,不能进行格式化输出 ,输出格式fputs(ch,stdout )

五、const关键字的介绍
1、const是一个类型修饰符,使用const修饰变量可以让变量的值不能改变。
2、 使用;修饰的变量成为了一个常量,它的值是不可变的
3、 const使用的地方:
1、 修饰变量
a) 、const int a=10;//值不允许修改,修饰变量使得变量变常量,但是可以使用指针去强制修改常量

     2、const int   int const 一样的

4、const修饰指针
1、int b=10,a=4;
const int *p 1=&b;
p=&a;
int *p=&a;
p=p1//p的指向可以变

    *p=100;//这句话是错的

定义指针变量p指向b,此处的const的作用是指针变量p的指向可以改变,但是指向的变量的值不能改变。

记忆技巧:
1、看const和的位置,如果const在的左侧 ,表示指针变量指向的变量的值不能改变,但是指向可以改变。 Const int *p
2、如果const在 * 的右侧 表示指针变量的值可以改变,但指向不能改变。 int * Const p
3、如果count在的左右都出现,表示指针变量的值和指向都不能变。Const int const p

六、内存的管理
1、内存管理:指软件运行时对计算机内存资源的分配和使用的技术。其主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
2、内存分配的方式:
a)、静态存储区分配
b)、在栈上创建(执行函数时分配的内存)
c)、从堆上分配(动态分配:运行时分配的内存)
3、内存分区:
栈 :是用户程序临时创建的局部变量
堆 :程序运行时动态分配 的内存。对象
BSS段(全局区) :用来存放未初始化的全局变量和静态变量
数据段(常量区) :已经初始化的全局变量和静态变量 (常量)
代码段 :源代码产生的二进制数据

七、常见的内存分配函数
三个动态的函数:malloc 、 calloc 、realloc
1、 malloc格式:void * malloc(unsigned size )
malloc包含在stdlib.h中,作用是在内存的堆区分配大小为size的内存空间,如果分配成功 返回内存的首地址 。失败返回 NULL
1.1注意:malloc申请的内存空间 ,如果不赋值malloc就是垃圾数据
//使用一个函数给malloc申请的空间进行初始化
初始化:memset(p,45,16)

2、 calloc 分配 指定块数和长度的内存空间,分配4块他们的地址也是连续的 。
2.1格式:calloc(块数 ,长度) calloc(4,4) 他会初始化为0
3、 realloc 函数可以给已经存在的空间扩充大小
p=realloc(p,40*sizeof(int )) ;//返回的是新分配内存的空间的地址(可以和原来的相等,也可以不相等)

八、野指针和内存泄露
1、使用free函数进行释放内存空间 free(p) free(要释放的空间首地址) p=NULl;//free以后,p是一个野指针,要给它在NULL;才可以解决。
补充:free以后就相当于把那一块地址给释放,别的变量也就可以使用了。

free函数只是将参数指针指向的内存归还给操作系统,并不会把参数指针置NULL,为了以后访问到被操作系统重新分配后的错误数据,所以在调用free之后,通常需要手动将指针置NULL。

九、指针函数
定义:这种返回值是指针的函数是指针函数
1、 格式:类型说明符 * 函数名(形参表) 如:int *sum (int x,int y){}
十、函数指针:指向函数的指针 函数名
int sum(int a,int b ); 的函数指针:int (*p1)(int a,int b );
定义了一个函数指针,p1可以存放返回值int类型并且有两个参数 ,参数类型也是int类型的函数的地址。
初始化:p=sum;//sum函数的首地址
注意:定义函数的时候,可以不用写形参名 int (*p2)(int ,int)
1)、函数指针变量不能进行算术运算,
2)、函数定义的(*p)是不能省略的
使用函数指针的优点:提高代码的复用性,提高开发效率,简化代码

0 0
原创粉丝点击