C语言如何将一个数组完整赋给另一个数组?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 C语言 正文

使用循环逐个元素赋值(适用于任何数组)

这是最通用的方法,适用于一维或多维数组,无论数组大小是否固定。

c语言把一个数组赋给另一个数组
(图片来源网络,侵删)

示例(一维数组)

#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;
}

使用 strcpystrncpy(仅适用于字符数组)

如果数组是字符数组(字符串),可以使用 <string.h> 中的 strcpystrncpy

c语言把一个数组赋给另一个数组
(图片来源网络,侵删)

示例

#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(高效)。
  • 对于多维数组,使用循环赋值。
  • 对于字符数组,使用 strcpystrncpy
  • 避免直接指针赋值(除非明确知道内存管理)。
c语言把一个数组赋给另一个数组
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
c语言运行helloworld
« 上一篇 01-05
织梦系统无法恢复数据库怎么办?
下一篇 » 01-05

相关文章

取消
微信二维码
支付宝二维码

目录[+]