【问题标题】:C memcpy behaviour with dynamic array动态数组的 C memcpy 行为
【发布时间】:2017-06-16 11:07:32
【问题描述】:

请注意memcpy 之后,我正在更改源矩阵中的值。它们会自动在目的地被替换。此外,当我更改目标数组值时,它们会进入源数组。为什么会这样? 有趣的是,即使在通过free 命令删除了目标数组之后,这些值仍然是源数组。请让我知道这一点。提前致谢。

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

double *** double3d(long int dim1,long int dim2,long int dim3)
{
    long int i,j,k;
    double ***array;
    array=(double ***)malloc(dim1*sizeof(double **));
    for(i=0;i<dim1;i++)
    {
     array[i]=(double **)malloc(dim2*sizeof(double *));
     for(j=0;j<dim2;j++)
      array[i][j]=(double *)malloc(dim3*sizeof(double ));
    }
    return array;
}// end double3d

void summ(double ***A,double ***B, double ****C)
{
    int i ,j ,k;
    for(i=0;i<10;i++)
        for(j=0;j<5;j++)
            for(k=0;k<5;k++)
                (*C)[i][j][k] = A[i][j][k] + B[i][j][k];
}

void main()
{
    int i,j,k,nx,ny;
    double ***M1, ***M2, ***M3, ***M4,***M5,***M6;
    nx=5;ny=5;
    M1=double3d(10,nx,ny);
    M2=double3d(10,nx,ny);
    M3=double3d(10,nx,ny);
    M4=double3d(5,nx,ny);
    M5=double3d(5,nx,ny);
    M6=(double ***)malloc(10*sizeof(double **));

    for(i=0;i<10;i++)
    {
        for(j=0;j<nx;j++)
            for(k=0;k<ny;k++)
            {
                M1[i][j][k]=i;
                M2[i][j][k]=1;
            }
    }

    // Note random values are in M4 and M5 as they are not initalised
    memcpy(M6,     M4, 5 * sizeof(double **));
    memcpy(M6+5,   M5, 5 * sizeof(double **));

    for(i=0;i<5;i++)
    {
       for(j=0;j<nx;j++)
          for(k=0;k<ny;k++)
          {
               M4[i][j][k]=200;
               M5[i][j][k]=700;
          }
    }

    printf(" printing M6 Memcpy before addition\n");
    for(j=0;j<nx;j++)
    {
       for(k=0;k<ny;k++)
           printf("%f ",M6[4][j][k]);
       printf("\n");
       for(k=0;k<ny;k++)
           printf("%f ",M6[9][j][k]);
       printf("\n");
    }
    // calling for non memcpy array
    summ(M1,M2,&M3); printf(" Non memcpy output last value : %f \n",M3[9][nx-1][ny-1]);
    // calling for memcpy
    summ(M1,M2,&M6); printf(" memcpy output last value : %f \n",M6[9][nx-1][ny-1]);
    printf(" printing M6 Memcpy for two sets after addtion\n");
    for(j=0;j<nx;j++)
    {
       for(k=0;k<ny;k++)
           printf("%f ",M6[4][j][k]);
       printf("\n");
    }
    for(j=0;j<nx;j++)
    {
       for(k=0;k<ny;k++)
           printf("%f ",M6[9][j][k]);
       printf("\n");
    }

    free(M6);// cleared M6

    printf(" printing M4 Memcpy after deleting M6\n");
    for(j=0;j<nx;j++)
    {
       for(k=0;k<ny;k++)
           printf("%.1f ,%.1f ,%.1f ,%.1f ,%.1f ",M4[0][j][k],M4[1][j][k],M4[2][j][k],M4[3][j][k],M4[4][j][k]);
       printf("\n");
    }

    printf(" printing M5 Memcpy after deleting M6\n");
    for(j=0;j<nx;j++)
    {
       for(k=0;k<ny;k++)
           printf("%.1f ,%.1f ,%.1f ,%.1f ,%.1f ",M5[0][j][k],M5[1][j][k],M5[2][j][k],M5[3][j][k],M5[4][j][k]);
       printf("\n");
    }
 }

【问题讨论】:

  • 你的代码中没有动态数组!!
  • 拜托哦,请不要成为另一个three star programmer。被称为不是恭维。
  • @SouravGhosh double3d 创建动态 3d 数组
  • @Someprogrammerdude 请不要接受它。我是学习者,我不知道为什么会这样。请运行并告诉我为什么会发生这种情况,顺便说一下我使用 gcc 编译它
  • 也许***指针对学习来说太多了。

标签: c arrays dynamic-arrays memcpy


【解决方案1】:

这里的“问题”是您(显然)误解了memcpy 的作用。

memcpy(M6,     M4, 5 * sizeof(double **));

你基本上在做的是

M6[0] = M4[0];
M6[1] = M4[1];
// etc...

即您正在复制 指针 而不是它们指向的内容。

当调用free(M6) 时,你只会释放M6 指向的内存。但是例如指向的数据M6[0] M4[0] 仍然存在,并且仍然被M4[0] 指向。

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 2020-07-20
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2021-11-18
    • 2016-06-15
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多