)
目录一、数组赋值核心约束核心结论初始化与赋值概念区分底层原理二、数组批量复制三种实现方案方案 1循环逐元素赋值方案 2字符串标准库函数2.1 strcpy 字符串复制2.2 strncpy 受限长度字符串复制2.3 strcat 字符串拼接方案 3内存块复制 memcpy核心特性三、strncpy 与 memcpy 对比重点strncpy字符串处理函数memcpy通用内存块拷贝函数选型规范示例对照四、复制方式汇总表五、核心考点总结一、数组赋值核心约束核心结论C 语言仅支持数组定义阶段批量初始化数组创建完成后不允许使用 实现数组整体赋值。char str[10] hello; // 定义时初始化语法合法 strcpy(str, hello); // 调用库函数完成字符串复制 str hello; // ❌编译错误 str[10] {hello}; // ❌语法错误str[10]代表单个char元素初始化与赋值概念区分初始化数组分配内存的同时写入初始数据属于编译器提供的特殊语法赋值内存开辟完成后运行时修改存储空间。底层原理数组名参与绝大多数表达式时会隐式转换为数组首元素地址该地址属于地址常量。常量不能放置在赋值运算符 左侧因此禁止 arr1 arr2 这类整体赋值写法。数组定义完成后如需批量复制数据可行方案for 循环逐元素拷贝字符串标准库函数仅适配\0结尾 C 风格字符串通用内存拷贝函数二、数组批量复制三种实现方案头文件依赖#include string.h方案 1循环逐元素赋值原理遍历数组逐个完成元素赋值。优点兼容任意数据类型char、int、结构体等复制过程中可增加数据运算、筛选逻辑无需引入 string.h缺点手动编码繁琐易产生边界错误适用场景复制时需要对数据进行额外处理。int src[5] {1,2,3,4,5}; int dst[5]; for(int i 0; i 5; i) { dst[i] src[i]; }方案 2字符串标准库函数适用范围仅限以 \0 作为终止符的 C 风格字符串2.1 strcpy 字符串复制函数原型char *strcpy(char *dst, const char *src);参数说明dst目标内存地址具备可写权限缓冲区空间充足src源字符串起始地址返回值目标地址 dst。执行规则逐字节复制遇到\0停止同时复制\0至目标缓冲区。⚠️缺陷无长度检测极易引发缓冲区溢出工程开发尽量避免使用。char str[10]; strcpy(str, hello); // ✅合法hello连同\0共6字节空间充足char str2[5]; strcpy(str2, hello); // ❌非法存储空间不足触发内存越界补充要点字符数组作为函数实参时退化为首地址源字符数组必须包含\0否则越界读取产生未定义行为。2.2 strncpy 受限长度字符串复制函数原型char *strncpy(char *dst, const char *src, size_t n);参数说明n复制字节上限一般设置为目标缓冲区大小返回值目标地址 dst。执行规则复制遇见\0提前终止有效字符不足 n 个时剩余空间填充\0读取满 n 字节仍未遇见\0直接结束复制不会自动追加末尾\0。⚠️风险提示源字符串长度 ≥ n 时目标数组缺少终止符不再是合法 C 字符串。2.3 strcat 字符串拼接函数原型char *strcat(char *dst, const char *src);使用硬性约束dst指向可读写内存dst存储合法字符串内存存在\0缓冲区可容纳原有内容、源字符串与终止符\0从原有\0位置开始覆盖追加源字符串。示例// 示例A ❌缓冲区空间不足 char s[]12345, t[]654321; strcpy(s,t); // 示例B ❌目标未初始化无有效终止符 char s[20], *t12345; strcat(s,t); // 示例C ✅满足全部约束条件 char s[20] , *t12345; strcat(s, t); // 示例D ❌目标指向只读字符串常量 char *s12345, *t54321; strcat(s,t);解析strcat 使用高频易错场景目标缓冲区容量不足、缺少有效\0、目标地址指向只读内存。方案 3内存块复制 memcpy函数原型void *memcpy(void *dest, const void *src, size_t n);参数说明dest目标内存地址src源内存地址n待复制字节数量返回值目标起始地址 dest。核心特性不区分数据类型支持任意内存块复制完全不识别\0严格复制指定的 n 个字节源地址与目标地址内存重叠时行为未定义重叠场景改用memmove。三、strncpy 与 memcpy 对比重点strncpy字符串处理函数最多复制 n 字节识别\0遇到\0立即停止复制有效字符不足 n 字节剩余位置填充\0仅适用于字符串场景。memcpy通用内存块拷贝函数无数据类型概念执行成功后固定拷贝完整 n 个字节忽略\0将终止符视作普通字节。选型规范C 字符串复制优先选用 strncpy整型数组、结构体、二进制原始内存复制只能使用 memcpy示例对照char src[] abc\0123; char buf1[8] {0}; char buf2[8] {0}; strncpy(buf1, src, 8); // 碰到\0停止剩余空间填充\0 memcpy(buf2, src, 8); // 强制复制8字节无视内部\0四、复制方式汇总表复制方式适用对象是否识别\0核心特点循环逐元素赋值任意类型数组不关心自由度最高支持复制过程中处理数据strcpyC 风格字符串✅识别无长度限制存在溢出风险工程慎用strncpyC 风格字符串✅识别限制最大长度字符串场景首选strcatC 风格字符串✅识别在字符串尾部追加内容memcpy任意内存块❌不识别按原始字节拷贝通用内存复制五、核心考点总结数组定义之后不能直接用 整体赋值必须依靠循环或库函数strcpy /strncpy/strcat 仅适用于合法 C 字符串不能拷贝 int 数组等非字符数据严格区分初始化与赋值仅数组定义时支持 char str[]xxxstrcpy 隐患缓冲区容量不足、源数组缺少\0strcat 必要条件目标内存预先存在合法\0strncpy 隐患源字符串超长时不会自动补充末尾\0字符串字面量存放在只读常量区不能作为 strcpy、strcat 的目标地址选型口诀字符串拷贝用 strncpy非字符数组、原始内存拷贝使用 memcpy。