使用循环逐个元素赋值(适用于任何数组)
这是最通用的方法,适用于一维或多维数组,无论数组大小是否固定。

(图片来源网络,侵删)
示例(一维数组)
#include <stdio.h>
int main() {
int arr1[] = {1, 2, 3, 4, 5};
int arr2[5]; // 目标数组大小必须 >= 源数组
// 循环赋值
for (int i = 0; i < 5; i++) {
arr2[i] = arr1[i];
}
// 打印结果
for (int i = 0; i < 5; i++) {
printf("%d ", arr2[i]);
}
return 0;
}
示例(二维数组)
#include <stdio.h>
int main() {
int arr1[2][3] = {{1, 2, 3}, {4, 5, 6}};
int arr2[2][3];
// 嵌套循环赋值
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
arr2[i][j] = arr1[i][j];
}
}
// 打印结果
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr2[i][j]);
}
printf("\n");
}
return 0;
}
使用 memcpy 函数(高效,适用于连续内存的数组)
如果数组是连续存储的(如一维数组或行优先的二维数组),可以使用 <string.h> 中的 memcpy 函数进行内存拷贝。
示例
#include <stdio.h>
#include <string.h>
int main() {
int arr1[] = {1, 2, 3, 4, 5};
int arr2[5];
// 使用 memcpy 拷贝内存
memcpy(arr2, arr1, sizeof(arr1));
// 打印结果
for (int i = 0; i < 5; i++) {
printf("%d ", arr2[i]);
}
return 0;
}
注意:
memcpy是按字节拷贝的,因此目标数组的大小必须足够大。- 适用于任何类型的数组(包括结构体数组),但需要确保内存布局连续。
使用 memmove 函数(处理内存重叠的情况)
如果源数组和目标数组有内存重叠(同一个数组的一部分拷贝到另一部分),应使用 memmove 而不是 memcpy。
示例
#include <stdio.h>
#include <string.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *src = &arr[1]; // 指向 arr[1]
int *dst = &arr[0]; // 指向 arr[0]
// 使用 memmove 处理重叠内存
memmove(dst, src, 4 * sizeof(int)); // 拷贝 arr[1..4] 到 arr[0..3]
// 打印结果
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
return 0;
}
使用 strcpy 或 strncpy(仅适用于字符数组)
如果数组是字符数组(字符串),可以使用 <string.h> 中的 strcpy 或 strncpy。

(图片来源网络,侵删)
示例
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[6]; // 目标数组大小必须 >= 源字符串长度 + 1
// 使用 strcpy 拷贝字符串
strcpy(str2, str1);
printf("%s\n", str2); // 输出 "Hello"
return 0;
}
注意:
strcpy不会检查目标数组大小,可能导致缓冲区溢出。strncpy可以指定最大拷贝长度,但仍需手动添加'\0'终止符。
使用指针(适用于动态分配的数组)
如果数组是动态分配的(如 malloc),可以直接使用指针赋值(但需注意内存管理)。
示例
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr1 = malloc(5 * sizeof(int));
int *arr2 = malloc(5 * sizeof(int));
// 初始化 arr1
for (int i = 0; i < 5; i++) {
arr1[i] = i + 1;
}
// 指针指向同一块内存(不推荐,会导致内存泄漏)
// arr2 = arr1; // 错误:arr2 的内存泄漏
// 正确做法:循环或 memcpy 拷贝
for (int i = 0; i < 5; i++) {
arr2[i] = arr1[i];
}
// 打印结果
for (int i = 0; i < 5; i++) {
printf("%d ", arr2[i]);
}
free(arr1);
free(arr2);
return 0;
}
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 循环赋值 | 任何数组 | 灵活,可处理多维数组 | 代码较长 |
memcpy |
连续内存数组 | 高效,适合大数据 | 不能处理内存重叠 |
memmove |
内存重叠的情况 | 安全处理重叠 | 比 memcpy 稍慢 |
strcpy/strncpy |
仅字符数组 | 简单 | 需注意缓冲区大小 |
| 指针赋值 | 动态数组 | 直接操作内存 | 容易导致内存泄漏 |
推荐:
- 对于普通数组,优先使用
memcpy(高效)。 - 对于多维数组,使用循环赋值。
- 对于字符数组,使用
strcpy或strncpy。 - 避免直接指针赋值(除非明确知道内存管理)。

(图片来源网络,侵删)
