2016-12-07 22 views
-2

この関数のこのバージョンは、良い作品:Cマトリックスとポインタエラー

int** outerProduct(int v[], int n){ 
    int i, j; 
    int **a = malloc(n*sizeof(int*)); 
    for(i=0; i<n; i++){ 
     a[i] = malloc(n*sizeof(int)); 
    } 

    for(i=0; i<n; i++){ 
     for(j=0; j<n; j++){ 
      *(*(a+i)+j) = v[i]*v[j]; 
     } 
    } 

    return a; 
} 

そして、これは動作しません:

int** outerProduct(int v[], int n){ 
    int i, j; 
    int **a = malloc(n*sizeof(int*)); 
    for(i=0; i<n; i++){ 
     a[i] = malloc(n*sizeof(int)); 
    } 

    for(i=0; i<n; i++){ 
     for(j=0; j<n; j++){ 
      *(a+(i*n)+j) = v[i]*v[j]; 
     } 
    } 

    return a; 
} 

エラーが*(a+(i*n)+j) = v[i]*v[j];ですが、私は理由を理解していません。それは同じことでなければなりません。

+1

2つの参照を比較していますか?それはどうやって「同じもの」になりますか? lhsにはさまざまな種類があります。 –

+0

2次元配列とは異なり、行が連続したメモリになるという保証はありません。 –

+0

@WeatherVane aaaahそうです。私はそれについて考えなかった。ありがとう! – KRower

答えて

1

2次元配列とは異なり、行が連続したメモリになるという保証はありません。

アレイ全体に対してのメモリ割り当てを1つだけ行うと、1次元配列へのポインタの配列を使用するときに失敗した方法でインデックスできます。

関連する問題