前言
近期完成C语言后半段进阶内容学习,从内存拷贝函数,到结构体对齐、枚举共用体,再到基础文件操作,把容易踩坑的知识点整理复盘,配套练习代码上传仓库。
代码仓库:https://gitcode.com/gcw_RyL6LF93/study-c-languague.git
一、内存操作系列函数(<string.h>)
1. memcpy 内存拷贝
作用:拷贝num个字节内存数据,支持任意类型数据复制,不处理内存重叠场景。
原型:void* memcpy(void* dest, const void* src, size_t num);
坑点:遇到两块内存区域重叠时,拷贝数据会被覆盖,结果出错;只负责按字节搬运,不会自动追加'\0'。
2. memmove 可重叠拷贝
原型:void* memmove(void* dest, const void* src, size_t tn);
核心逻辑:先判断两块内存是否重叠
如果 dest > src:从后向前倒着拷贝字节,防止源数据被提前覆盖
如果 dest < src:从前向后顺序拷贝
memmove可以兼容重叠拷贝,memcpy标准不要求处理重叠,日常练习尽量区分两者使用场景。
3. memset 内存设置
按字节填充内存值,常用于数组清零;
易错:第二个参数是单字节数值,不要直接填充int大数,容易出现意料之外的值。
补充:strerror用于返回错误码对应的文字描述。
二、结构体 struct
自引用结构体:结构体内部包含指向自身类型的结构体指针,链表节点就是典型用法。
struct node
{
struct node* next;
};
typedef重命名结构体类型,简化书写。
访问成员:结构体变量 .成员名;结构体指针 ->成员名。
✨结构体内存对齐规则(高频考点)
第一个成员放在偏移量为0的地址处;
后面每个成员,对齐到自身大小与默认对齐数之间较小值的整数倍地址;
整体结构体大小:是结构体最大对齐数的整数倍;
对齐本质:牺牲一点内存空间,换取CPU读取内存的速度,属于空间换时间。
三、共用体 union、枚举 enum、typedef
共用体(联合体 union)
大小等于内部占用空间最大成员的大小;
所有成员共用同一块内存,修改一个成员的值,其余成员数据会被覆盖。
枚举 enum
把一组整型常量打包起名,默认从0依次自增;可以手动指定枚举常量的数值。
typedef 类型重命名
给已有类型起别名,简化长类型名书写,结构体搭配typedef使用非常频繁。
四、文件基础操作
FILE* fp:文件指针,用来标记操作的文件流;
fopen():打开文件;
fprintf():向文件写入数据;
fclose():关闭文件,用完文件一定要关闭,避免资源泄漏。
五、学习小结
这一段知识点偏向底层内存逻辑,不再只关注表层语法。
内存重叠拷贝、结构体内存对齐是很容易理解模糊的地方,手写代码调试才能把抽象的内存变化看懂。
全部练习代码存放在仓库,后续继续更新C语言收尾练习,准备过渡单片机学习。
仓库链接:https://gitcode.com/gcw_RyL6LF93/study-c-languague.git