簡體   English   中英

將memcpy用於二維動態數組?

[英]Using memcpy for two dimensional dynamic array?

我可以很好地聲明兩個矩陣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");
}

您在初始化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");
}

我的代碼是否正確使用memcpy?

不,你的代碼是錯誤的,但是這是一個較小的memcpy問題。 您只是在做C數組錯誤。

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

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

好的, MatrixA現在是一個指向10個元素的整數數組的指針,對嗎? 因此,編譯器將內存保留為十個整數。 但是,在malloc行中,使用指向單個整數大小十倍的內存區域的指針覆蓋了該指針。 一個代碼分析工具將告訴您您已經建立了內存泄漏。

這些錯誤在您的代碼中一直存在; 您將必須了解使用malloc靜態分配的C數組與動態分配之間的區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM