将2d动态行分配给1d数组

时间:2011-04-27 21:49:21

标签: c memory-management

我正在尝试将2d数组的第i行值分配给1d数组。这些数组是动态创建的。我的代码是:

#include <stdio.h>
#include <stdlib.h>

#define N 10
#define FRAC 10

int main(int argc, char *argv[]){

    int i, j;
    double **A, *B;

    A=(double**)malloc(sizeof(double)*N);
    for (i=0; i<N; i++){
        A[i]=(double*)malloc(sizeof(double)*N);
    }

    for (i=0; i<N; i++){
        for(j=0; j<N; j++){
            A[i][j]=i*j/FRAC;
        }
    }

    B=A[0];

    for(i=0; i<N; i++)
        printf("%f\n",B[i]);

    system("PAUSE");

    return 0;
}

打印B时,所有值均显示为0.0000。这有什么问题?

2 个答案:

答案 0 :(得分:3)

如果你看看你的循环:

for (i=0; i<N; i++){
    for(j=0; j<N; j++){
        A[i][j]=i*j/FRAC;
    }
}

您会看到A[0]中的每个元素都与i == 0相乘,因此您的B将全部为零。

如果您指定B = A[1]并通过将FRAC定义为10.0(或通过添加显式强制转换)强制计算进入浮点模式,您将看到printf更有趣的内容{ {1}}循环。

而且,虽然我在这里,请不要从malloc投出返回值,这是没有必要的,它经常隐藏错误。您还没有正确分配A,您应该A = malloc(sizeof(double *) * N);幸运的是,double几乎总是至少与指针一样大。

您程序的修改版本:

#include <stdio.h>
#include <stdlib.h>

#define N 10
#define FRAC 10.0   /* CHANGED */

int main(int argc, char *argv[]) {
    int i, j;
    double **A, *B;

    A = malloc(sizeof(double *) * N);
    for(i = 0; i < N; i++) {
        A[i] = malloc(sizeof(double) * N);
    }

    for(i = 0; i < N; i++) {
        for(j = 0; j < N; j++) {
            /* This is floating point now that FRAC is 10.0 */
            A[i][j]= i * j / FRAC;
        }
    }

    B = A[1];   /* A[0] is all 0.0 so we'll look at A[1] instead. */
    for(i = 0; i < N; i++)
        printf("%f\n", B[i]);

    return 0;
}

产生以下内容(比一堆零更有趣,更有启发性):

0.000000
0.100000
0.200000
0.300000
0.400000
0.500000
0.600000
0.700000
0.800000
0.900000

答案 1 :(得分:1)

i*jFRAC都是整数,而在C中,除以两个整数会产生一个整数,丢弃通常所有的小数。

FRAC更改为显式为浮点值,例如使用10.0代替10