在动态指针数组和静态数组之间复制数据

标签 c pointers

我尝试定义一个动态数组,将静态数组中的数据复制到动态数组中,然后再复制回静态数组。但似乎数据没有正确复制。我做错了什么吗?

    #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

最佳答案

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

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

应该是这样的:

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

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

关于在动态指针数组和静态数组之间复制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12617530/

相关文章:

c - C 中的十进制值被认为是真的吗?

c - 调用open时如何调用sys_open而不是sys_openat

c - 为什么这段使用 fork() 的代码可以工作?

c - 使用strncpy复制字符串时遇到异常

c++ - 如何计算C++模板函数中有效指针元素的总数?

c - 整数提升和右移

c - 在 C 中返回 malloced 指针

Delphi——将整数转换为类型指针?

c - 为什么 %u %d 在 UNIX/LINUX 上不能用于打印地址

c - 如何在 C 中对指向 char 的指针数组进行 qsort?