我尝试定义动态数组,将数据从静态数组复制到动态数组中,然后复制回静态数组。但似乎数据没有正确复制。我做错了吗?
#include <stdio.h>
int main(){
int n = 2;
double a[2][2];
double c[2][2];
a[0][0] = 0.0;
a[0][1] = 0.1;
a[1][0] = 1.0;
a[1][1] = 1.1;
double* b = NULL;
double* p = NULL;
int i,j;
b = (double*) malloc(n*n*sizeof(double));
for(i=0; i<n; i++){
for(j=0; j<n; j++){
p = b+i;
*(p+j) = a[i][j];
}
}
memcpy(c, b, sizeof(*b));
for(i=0; i<n; i++){
for(j=0; j<n; j++){
p = b+i;
fprintf(stderr, "[%d][%d] = %.1f, c[%d][%d] = %.1f \n", i, j, *(p+j), i, j, c[i][j]);
}
}
free(b);
b = NULL;
return 0;
}
结果
[0] [0] = 0.0,c [0] [0] = 0.0
[0] [1] = 1.0,c [0] [1] = 0.0
[1] [0] = 1.0,c [1] [0] = 0.0
[1] [1] = 1.1,c [1] [1] = 0.0
答案 0 :(得分:1)
问题(或其中之一)可能是您正在尝试
p = b+i;
*(p+j) = a[i][j];
应该是这样的:
*(p+i*n+j) = a[i][j];
原因是,您可能希望将“按行”数据存储到指针的内存中,因此将i * n相乘至关重要。如果您无法直观显示它,请设想j = 0,因此您希望行的第一个条目位于索引0,n,2 * n,...中。
答案 1 :(得分:1)
根据我的意见,你错误地分配了记忆, 你应该尝试下面的代码
#include <stdio.h>
int main()
{
int n = 2;
double a[2][2];
double c[2][2];
a[0][0] = 0.0;
a[0][1] = 0.1;
a[1][0] = 1.0;
a[1][1] = 1.1;
double** b = NULL;
int i,j;
b = (double**) malloc(n * sizeof(double*));
for(i = 0; i < n; i++)
b[i] = (double *)malloc(n * sizeof(double));
for(i=0; i<n; i++){
for(j=0; j<n; j++){
b[i][j] = a[i][j];
}
}
memcpy(c, b, (n*n*sizeof(double)));
for(i=0; i<n; i++){
for(j=0; j<n; j++){
printf("b[%d][%d] = %lf, c[%d][%d] = %lf, a = %lf\n", i, j, b[i][j], i, j, c[i][j], a[i][j]);
}
}
}
答案 2 :(得分:0)
sizeof(*b)
中的{p> memcpy
是你的问题,你得到一个双倍的大小。您需要将malloc
中使用的大小存储在变量(或常量)中并使用它。