2011-11-07 7 views
1

これは私の宿題の一部です。助けが必要です。私の仕事は行列の主対角線上の数字が降順になるように行と列を入れ替えることです。行と列の数は同じです。私は動的にメモリを割り当てる必要があります。ここで2次元配列の主対角線上の値を交換する - C

は一例であり: 入力:

1 2  1<4 so we swap rows and columns and the final result is 4 3 
    3 4                2 1 

問題は、私は3×3アレイ又はさらに大きなを挿入すると、私はセグメンテーション違反のいくつかの種類を取得することです。ここに私のコードです、助けてください!

int **t, n, i, j, aux; 
    printf("Insert the size of the matrix: "); 
    scanf("%d",&n); 

    t = malloc(n * sizeof(int *)); 

    for(i=1; i <= n; i++){ 
      t[i]=malloc(n * sizeof(int)); 
    } 
    for(i=1; i<=n; i++){ 
      for(j=1; j<=n; j++){ 
        printf("Element [%d][%d] : ", i, j); 
        scanf("%d", &t[i][j]); 
      } 
    } 

    for(i=2; i<=n; i++){ 
      if(t[i][i] > t[i-1][i-1]){ 
        j=i-1; 
        for(i=1; i<=n; i++){ 
          aux=t[i][j]; 
          t[i][j]=t[i][j+1]; 
          t[i][j+1]=aux; 
        } 
        i=j; 
        for(j=1; j<=n; j++){ 
          aux=t[i][j]; 
          t[i][j]=t[i+1][j]; 
          t[i+1][j]=aux; 
        } 
        i=1; 
      } 
    i++; 
    } 
    for(i=1; i<= n; i++){ 
      free(t[i]); 
    } 
    free(t); 

今、私が手にエラーは次のとおりです:

The matrix inserted: 
    1 2 3 
    4 5 6 
    7 8 9 
    The matrix after swapping: 
    5 4 6 
    2 1 3 
    8 7 9 
    *** glibc detected *** ./6: double free or corruption (out): 0x08e42018 *** 
    ======= Backtrace: ========= 
    /lib/i686/cmov/libc.so.6[0xb7649764] 
    /lib/i686/cmov/libc.so.6(cfree+0x96)[0xb764b966] 
    ./6[0x80488fb] 
    .... 

は、事前にありがとう!それのサイズがNある場合

+0

はなぜ '**代わりT'の[配列の配列(http://c-faq.com/~scs/cclass/int/sx9.html)を使用していません?それはあなたのコードをより読みやすくします –

+0

もし私が動的に割り当てられた配列を使う義務がなければ、私はそれをやったでしょう。配列の配列を使用していれば、読みやすくなっていると私は同意します。 (もし私が何かを得なかったら私を修正してください。) – Constantin

答えて

4

配列インデックスは、N-1にから始まります。それが言われて、あなたはそれを世話するかなりの場所を持っています。配列のインデックスで安全に再生できます。例えば ​​-

for(i=1; i <= n; i++){ // Should be i=0; i < n; i++ 
     t[i]=malloc(n * sizeof(int)); 
} 
+0

はエラーを取り除きましたが、それでも主対角線(最初の2つだけ)の要素を入れ替えることはありません。なぜどんなアイデア? btw、助けてくれてありがとう;) – Constantin

+0

メインの対角線に要素の並べ替えを実装し、元の対角線をソートしたものに置き換えてみませんか? – Tudor

+0

実際に私の心を横切っていませんでした。タスクの1つの部分は、スワッピングの各段階でマトリックスを印刷することでした。そのため、私はこれが唯一の方法であると判断しました。 – Constantin

関連する問題