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;
    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

4

3 回答 3

1

问题(或其中之一)可能是您正在尝试

 p = b+i;
*(p+j) = a[i][j];

而应该是这样的:

*(p+i*n+j) = a[i][j];

原因是,您可能希望将数据“逐行”存储到指针处的内存中,因此乘以 i*n 至关重要。如果您无法将其可视化,请想象 j=0,因此您希望行的第一个条目位于索引 0, n, 2*n,... 中。

于 2012-09-27T08:58:17.667 回答
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]);
        }
    }
}
于 2012-09-27T13:01:50.750 回答
0

sizeof(*b)memcpy你的问题,你只得到一个双倍的大小。您需要将使用的大小存储在malloc变量(或常量)中并使用它。

于 2012-09-27T08:57:14.583 回答