![](/img/trans.png)
[英]Copy two dimensional dynamic array(pointers) to a static array using 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.