【问题标题】:Using memcpy for two dimensional dynamic array?将 memcpy 用于二维动态数组?
【发布时间】:2015-12-31 13:43:48
【问题描述】:

我能够很好地声明两个矩阵 A 和 B。

但是,当使用 memcpy(从 A 复制 B)时,B 给了我 0 的数组。

我该怎么办?我的代码是否适合使用 memcpy?

int r = 10, c = 10, i, j;

int (*MatrixA)[r];
MatrixA=malloc(c * sizeof(*MatrixA));
int (*MatrixB)[r];
MatrixB=malloc(c * sizeof(*MatrixB));

memcpy(MatrixB,MatrixA,c * sizeof(MatrixA));


for(i=1;i<r+1;i++)
{
     for (j = 1; j < c+1; j++)
    {
        MatrixA[i][j]=j;
         printf("A[%d][%d]= %d\t",i,j,MatrixA[i][j]);
    }
    printf("\n");
}
printf("\n");printf("\n");printf("\n");printf("\n");printf("\n");

for(i=1;i<r+1;i++)
{
     for (j = 1; j < c+1; j++)
    {
        printf("B[%d][%d]= %d\t",i,j,MatrixB[i][j]);
    }
    printf("\n");
}

【问题讨论】:

  • 好吧,你初始化mallocated空间了吗?
  • memcpy(MatrixB,MatrixA,c * sizeof(MatrixA)); --> memcpy(MatrixB,MatrixA,c * sizeof(*MatrixA)); 并移至设置为 MatrixA 的值之后。索引也超出范围。因为 0 原点。
  • 我认为这不是 malloc 的事实,因为 A 矩阵的声明很好,输出也很好。
  • 是的,但是您在将 MatrixA 的(未定义的)内容复制到 MatrixB 后对其进行了初始化。此外,索引从 0 开始。
  • SAMPLE

标签: c memcpy


【解决方案1】:

您在初始化 MatrixA 之前复制了内容。而且您访问的索引越界(r+1 评估 11 越界)导致 UB。改为这样做 -

for(i=0;i<r;i++)            //  i starts from 0 
{
    for (j =0; j < c; j++)         // j from 0
  {
       MatrixA[i][j]=j;
       printf("A[%d][%d]= %d\t",i,j,MatrixA[i][j]);
  }
   printf("\n");
}

memcpy(MatrixB,MatrixA,c * sizeof(*MatrixA));   // copy after setting MatrixA

for(i=0;i<r;i++)              // similarly indexing starts with 0
{
    for (j =0; j < c; j++)
  {
    printf("B[%d][%d]= %d\t",i,j,MatrixB[i][j]);
  }
  printf("\n");
}

【讨论】:

    【解决方案2】:

    我的代码是否适合使用 memcpy?

    不,您的代码是错误的,但这不是memcpy 的问题。你只是做错了 C 数组。

    int r = 10, c = 10, i, j;
    
    int (*MatrixA)[r];
    MatrixA=malloc(c * sizeof(*MatrixA));
    

    好的,MatrixA 现在是一个指向 10 元素整数数组的指针,对吧?所以编译器为十个整数保留内存;但是,在malloc 行中,您使用指向十倍于单个整数大小的内存区域的指针来覆盖它。代码分析工具会告诉您您已经构建了内存泄漏。

    这些错误在您的代码中不断出现;您必须了解静态分配的 C 数组和使用 malloc 的动态分配之间的区别。

    【讨论】:

    • 不,我不这么认为。需要为其分配内存,因为MatrixA只是一个指针并且未初始化。
    • @Marcus Muller,我想使用带有动态数组的 memcpy 作为我上面列出的代码。你能至少给我什么是用 memcpy 编写的正确指令吗?
    • 你做错动态数组,所以不,我不会帮你打自己的脚。
    • @ameyCU:关于未初始化,你是对的,但它已经分配了,所以 malloc 在这里肯定是错误的。
    • "MatrixA 现在是一个 10 元素的 int 指针数组,对吗?" 不,您正在考虑 int *MatrixA[r];int (*MatrixA)[r]; 是指向 r 整数数组的指针。
    猜你喜欢
    • 2018-01-09
    • 2021-11-18
    • 1970-01-01
    • 2015-06-05
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多