c语言部分基础知识的整理

c语言部分基础知识的整理 项目空闲时间的整理理解这些基础之后操作起来才会减少bug的产生调试起来也更加快速个人的短浅理解有错误万望指正1.一般c的内存摆放从上到下的内容为高地址-》 栈 向下生长堆 向上生长bass段data段rodata段低地址-》 代码段解析栈内存放的内容1.函数调用时切换与恢复上下文时存放内容2. 局部变量函数内部定义的非静态变量无论是指针结构体还是数组3.函数的参数4.编译器产生的中间计算变量结果栈的特点后进先出调用函数时分配函数所需要的资源函数退出时函数所占用的资源全部释放staticmalloc除外堆存放手动管理的内存malloc,calloc,realloc,new(c)分配的内存块需要手动释放free, delete.释放之后原指针就悬空了建议手动赋值为空。malloc() :在堆上分配一块指定自己数的连续内存。注意不会初始化内存里的数据申请了内存之后需要对这块内存全部操作不要对为操作的内存做判断速度相对比较快。calloc():比malloc分配的内存多了一步清零的操作。realloc():对现有的一块内存进行拉伸或者缩小要注意判断其返回值。bass:未初始化的全局变量未初始化的静态局部变量显示初始化为0的全局或局部静态变量。data:已初始化的的非零的全局变量与静态的局部变量初始值在可执行文件中加载时会直接映射到内存中。rodata:字符串常量const修饰的全局变量与静态局部变量注意const修饰的局部变量仍在栈上但是编译器会有它的只读性代码段存放可执行的机器指令。2.const关键字的用法修饰变量const int a 10;变量只读不能修改修饰指针指针常量/常量指针我个人是把后面的名称作为主题进行区分const int* p:指向常量的指针指向的值不能改int* const p :常量指针指针本身不能修改const int* const p:指针本身与指针指向的值都不能修改修饰函数阐述 void func(const char* p) 确保在函数内部不改变指针指向的数据修饰函数返回值 const char* func(void) 返回的指针指向的内容不应该修改c中int getname() const 表示该函数不修改对象的状态3.sizeof与strlen的区别sizeof:编译时计算返回变量/类型占用的内存大小包括最后的\0)strlen:运行时计算返回字符串的实际长度从头到第一个\0sizeof的特性就注定了可以使用uint8_t data[sizeof(结构体类型]这种用法可以方便的操作字节流的数据。4.uinon与struct的用法struct:其中的各个成员都有自己独立的内存注意内存对齐可以使用__attribute__((packed))把内存压实union:所有的成员公用同一块内存大小等于最大成员的大小同一时刻只用一个成员变量有效我一般是与位域联合使用union ControlReg { uint8_t all; // 整体操作 struct { uint8_t enable : 1; // 第0位使能 uint8_t mode : 2; // 第1-2位模式 uint8_t flag : 1; // 第3位标志 uint8_t resv : 4; // 第4-7位保留 } bits; // 按位域操作 };我一般是按照这样操作联合体。计算结构体内某个变量相对与首地址的偏移(结构体类型的指针0-结构体变量),操作之后就是该变量相对于结构体首地址的偏移这个只能获取偏移不能解引用5.static关键字的使用1.其修饰局部变量改变变量的存储位置函数退出后值保持不变生命周期为整个程序的运行过程2.修饰全局变量把该变量限制在当前的.c文件中其他文件中无法通过extern进行访问防止命名冲突3.修饰函数把该函数限制在当前的.c文件中其他文件不能使用6.指针数组与数组指针的区别优先级 [] * 个人习惯指针数组数组内存放的是指针数组指针:指针指向的是一个数组举例int*p[10]:数组p内存放的是10个int*类型的指针int(*p)[10]:指针p指向的是一个含有10个int类型的数组7.野指针野指针常见的三个场景1.声明了指针但是没有初始化这个指针指向的是随机地址没有确定指向的时候指向空 2.free(p)之后没有将p置为null, 3.数组越界或者指针算已经超出了合法的范围 避免办法初始化时赋值或置null)free后置null,使用前判断是否为null8.死锁死锁是指两个或多个线程或任务因争夺资源而无限期的互相等待导致都无法继续执行的状态满足的四个条件1.互斥条件2.保持与请求3不可剥夺4.循环等待解决方案 预防统一加锁顺序一次性申请所有资源避免银行家算法rtos中不用检测 恢复检测到死锁强制介入恢复9.可重入函数可重入函数是指可以被多个任务或中断安全的同时调用的函数要求1.不使用全局变量和静态变量或对它们进行了保护2.只使用局部变量和形参3.不使用可重入函数4.不使用与硬件有关的判断只使用软件的逻辑10.软链接与硬链接硬链接是文件的别名其原理是磁盘上的每个文件都有单独的标识符叫inode,硬链接就是让多个文件名指向同一个inode,文件系统是靠链接计数来记录文件有几个名字删除单个文件后只是链接计数减一直到链接计数减为0的时候才会删除数据不能跨文件系统不能对目录进行硬链接防止形成循环目录。软链接相等于一个文件的快捷方式其原理是软连接是一个独立的新文件有字节的inode,文件内存放的内容是目标文件的路径可以对目录创建软链接一旦删除目标文件所有的软连接都会失效。