【问题标题】:C memcpy 2D arrayC memcpy 二维数组
【发布时间】:2021-11-18 13:57:33
【问题描述】:

我正在尝试使用memcpy 将一个二维数组复制到另一个数组。我的代码:

#include <stdio.h>
#include <string.h>

int print(int arr[][3], int n) {
    for (int r = 0; r < 3; ++r) {
        for (int c = 0; c < n; ++c)
            printf("%d ", arr[r][c]);
        printf("\n");
    }
}

int main() {
    int arr[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int arr_copy[3][3];

    print(arr, 3);
    memcpy(arr_copy, arr, 3);
    print(arr_copy, 3);

    return 0;
}

结果:

1 2 3 
4 5 6 
7 8 9 
-1426063359 32726 -1902787872 
22012 0 0 
-1902788416 22012 48074240

我也试过了:

for (int i = 0; i < 3; ++i)
    memcpy(arr_copy[i], arr[i], 3);

为什么上面的代码不起作用,我应该如何更正?

【问题讨论】:

  • memcpy() 的第三个参数是要复制的字节数。为什么你只通过了 3 个?
  • memcpy(arr_copy, arr, sizeof(arr_copy))
  • memcpy(arr_copy, arr, sizeof arr); 应该这样做 - 或者 for (int i = 0; i &lt; 3; ++i) memcpy(arr_copy[i], arr[i], sizeof arr[i]); 用于第二个版本
  • @TedLyngmo 在第一个(更简单的)版本中看不到任何 UB。每个数组都会占用连续的内存。
  • @Ted - 我在new question 中提出了这个问题。希望你不介意我引用你的话。 (另外, UB 是int print 函数不返回任何内容!)

标签: c multidimensional-array memcpy


【解决方案1】:

大小以字节为单位,因此您只复制 3 个字节 - 甚至没有一个整数。

memcpy(arr_copy, arr, 3);

您可以通过以字节为单位打印数组大小来查看数组的大小:

printf("sizeof(arr) = %zu\n", sizeof(arr));

所以正确的memcpy代码应该是:

memcpy(arr_copy, arr, sizeof(arr));

同样的错误:

memcpy(arr_copy[i], arr[i], 3);

必须是:

memcpy(arr_copy[i], arr[i], sizeof(arr[i]));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2013-05-29
    • 2015-12-31
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多