嵌入式学习Day15---C语言进阶

一、内存管理 

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语言终于尾声啦,再有最后一天讲完链表就结束了。

        加油! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值