一、内存管理
1.1. 操作指针
操作野指针会导致程序崩溃,操作指针时,注意指针指向的空间是否存在?是否可用?
1.2.溢出问题
1.存储越界
当使用strcat、strcpy、strcmp函数时可能会产生内存越界;
应该用strncat、strncpy、strncmp函数替代;
2.越界访问
数组避免越界访问 ;
字符串缺少\0导致的越界访问;
1.3.堆空间使用
1)malloc
void *malloc(size_t size);
功能:
申请size个字节的堆区空间
参数:
size:申请空间的大小
返回值:
如果成功,返回指向申请空间的指针
如果失败,返回NULL
2)free
void free(void *ptr);
功能:
释放堆区空间
参数:
ptr:堆区空间首地址
返回值:
缺省
3)malloc使用场景
1.函数体内部的局部变量会随函数结束被回收,可以考虑存放到堆区空间中避免随函数结束回收
2.C语言中可变长数组可以通过malloc实现(如下代码)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int n = 0;
int i = 0;
int *p = NULL;
int sum = 0;
scanf("%d", &n);
p = malloc(sizeof(int) * n);
if (NULL == p)
{
printf("malloc failed\n");
return -1;
}
for (i = 0; i < n; i++)
{
scanf("%d", &p[i]);
}
for (i = 0; i < n; i++)
{
sum += p[i];
}
printf("%.2lf\n", sum / (double)n);
free(p);
return 0;
}
1.4.内存碎片
一个连续的空间存放了好多大小不一的数据,当相间的大数据释放后,剩余的空间很大但里面由好多小数据间隔存放,此时空间够存放一个大数据,但由于间隔小数据空间不连续无法存放大数据。
二、链表
2.1.单链表
1.与数组区别
数组
1.数组是有限个元素的集合
2.数组的空间必须连续
3.数组的插入和删除效率低
单链表
1.链表空间不需要连续
2.链表元素个数没有上限
3.链表存储空间变大
4.单向链表、双向链表、内核链表、循环链表
5.插入和删除效率很高
2.2.双链表
2.3.循环链表
2.4.内核链表
三、总结
2024年7月27日,学习的第15天。C语言终于尾声啦,再有最后一天讲完链表就结束了。
加油!