2011-04-27 229 views
0

我想分配2d數組的ith行值到1d數組。這些數組是動態創建的。我的代碼是:分配2d動態行到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。這裏有什麼問題?

回答

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]並通過定義FRAC10.0(或通過添加顯式轉換)強制計算到浮點模式,你會看到從你printf循環更有趣的東西。

而且,雖然我在這裏,請不要從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 
+0

我真的很不好意思ATM :)我試着找出幾個小時。謝謝你,先生! – onatm 2011-04-27 22:03:00

+0

感謝您提供分配內存的提示。我必須提高自己的內存管理。 – onatm 2011-04-27 22:13:35

1

i*jFRAC都是整數,在C中,將兩個整數相除會得到一個整數,從而丟棄您通常使用的任何小數。

FRAC更改爲顯式地爲浮點值,例如,通過使用10.0而不是10