整体学习笔记都是基于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.以最大的单个成员长度为准
- 2.总大小一定是最大数据类型单个成员的整数倍;
- 示例如下:
-
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 }联合体和结构体的差别
-
使用的区别
结构体:一种事物中包含多个属性;
共同体:一个属性有多种数据类型;
-
存储方式
结构体:各存各的;
共同体:存一起,多次存会覆盖;
-
内存占用
结构体:各个变量的总和(受内存对齐影响);
共同体:最大数据类型整数倍(受内存对齐影响);
-
枚举
-
枚举(Enumeration)是一种用户定义的类型,它允许程序员定义一组命名的整型常量。
-
枚举类型在处理一组固定的常量值时非常有用;
-
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"); } } -
指定枚举成员的值
在定义枚举时,可以为每个成员指定一个值。如果未指定,默认从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 全局变量,未初始化,程序运行时开辟,程序结束时自动释放;[可读,可写]
常量区:只读字符串数组,程序运行时开辟,程序结束时释放;[只读区域]

被折叠的 条评论
为什么被折叠?



