嵌入式C语言学习笔记 - 共同体、枚举、内存使用

整体学习笔记都是基于Linux平台实现的代码编写;

通过vscode中的remote-ssh组件远程登录到Ubuntu系统中,代码编译通过GCC实现;

联合体(公用体、共同体)

核心:一种数据可能有多种数据类型,一个自定义的数据类型;

联合体的两种定义方式

union money1
{
	char a;
	int b;
	float c;
	double d;
};


typedef union
{
	int a;
	float b;
	double c;
}money_t; //起别名

特点如下:

1.所有的变量都使用同一个内存空间;

2.所占的内存大小为最大数据类型成员的长度(也受内存对齐影响);

3.每次只能给一个变量进行赋值,因为第二次赋值会覆盖原有的数据;

4.怎么存储的,怎么读取;

细节点

  1. 1.以最大的单个成员长度为准
  2. 2.总大小一定是最大数据类型单个成员的整数倍;
  3. 示例如下:
  4. typedef union 
    {
    	char a[60];
    	int b;
    	float c;
    	double d;
    }money_t;
    
    int main(int argc,char *argv[])
    {
        money_t money;
    	printf("the size of money_t is %lu\n",sizeof(money));//结果64
    }

    联合体和结构体的差别

  5. 使用的区别

    结构体:一种事物中包含多个属性;

    共同体:一个属性有多种数据类型;

  6. 存储方式

    结构体:各存各的;

    共同体:存一起,多次存会覆盖;

  7. 内存占用

    结构体:各个变量的总和(受内存对齐影响);

    共同体:最大数据类型整数倍(受内存对齐影响);

  8. 枚举

  9. 枚举(Enumeration)是一种用户定义的类型,它允许程序员定义一组命名的整型常量。

  10. 枚举类型在处理一组固定的常量值时非常有用;

  11. enum Weekdays
    { 
        Sunday, 
        Monday, 
        Tuesday, 
        Wednesday, 
        Thursday, 
        Friday, 
        Saturday 
    };
    
    
    void printDay(enum Weekdays day) 
    {
        switch (day) 
        {
            case Sunday:
                printf("Sunday\n");
                break;
            case Monday:
                printf("Monday\n");
                break;
            // 其他情况...
            default:
                printf("Invalid day\n");
        }
    }

  12. 指定枚举成员的值

    在定义枚举时,可以为每个成员指定一个值。如果未指定,默认从0开始,每个成员的值依次增加1;

动态内存分配

依赖头文件<stdlib.h>

常见函数

malloc(memory allocation):申请连续内存空间(效率更高一些);

calloc(contiguous allocation): 申请连续内存空间+数据初始化(不同数据类型初始化内容不一致);

realloc(re- allocation ) :修改申请内存空间大小(扩容:空间原有数据不受影响)

free:释放已经申请的内存空间

<stdlib.h>声明:

extern void *malloc (size_t __size)//申请内存空间大小(1byte)

extern void *calloc (size_t __nmemb, size_t __size)//申请对象的数量,申请对象占用空间的大小

extern void *realloc (void *__ptr, size_t __size) //需要重新申请空间指针(__ptr)以及空间大小(__size)

extern void free (void *__ptr) //入参已申请内存空间的指针(__ptr)

重点注意:内存使用完后需要及时释放(根据实际业务需要),不及时释放可能会造成内存泄漏;

使用细节说明:

1.malloc 创建内存空间的单位是字节;

2.malloc 返回的是void类型的指针,没有步长的概念,也无法获取空间的数据,需要强制转换;

3.malloc 返回的是首地址,没有空间大小;最好定义一个变量记录总大小;

4.malloc 申请的空间不会自动消失,如果不能正确及时释放,会导致内存泄漏

5.malloc 申请的空间过多,会产生虚拟内存(虚拟:假的,当申请空间过多,因为每一个内存空间不会在刚申请的时候就立马使用,所以C语言并不会立马就在内存中开辟空间,而是什么时候开始存储数据了,才会真正的分配空间;目的:为了提高内存的使用效率);

6.malloc 申请的空间没有初始化的数值,需要先赋值才能使用;

7.free释放空间之后,内存空间中的户数叫做脏数据,可能被清空,可能被修改为其他值;

8.calloc 就是在malloc的基础上增加一个初始化的动作;不同数据类型初始化值不同;

9.realloc 修改之后的空间,地址值有可能发生变化,也有可能不变,但是原本的数据不会丢失;

10.realloc 修改之后,无需释放原来的空间,函数底层会进行处理;

C语言内结构

栈(heap):函数运行的区域(函数内部变量、数组、传参、返回)(压栈、出栈),自动分配释放;[可读、可写];

堆(stark):运行过程中调用malloc、calloc、realloc动态申请内存的区域,由程序员分配及释放;[可读,可写]

代码区:运行时代码加载到这里(临时存储);[只读区域]

初始化静态区:全局变量,static修饰的变量,已经初始化,程序运行时开辟,程序结束时自动释放;[可读,可写]

未初始化静态区:static 全局变量,未初始化,程序运行时开辟,程序结束时自动释放;[可读,可写]

常量区:只读字符串数组,程序运行时开辟,程序结束时释放;[只读区域]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值