2

私のプログラムを理解し、完成させるためにあなたの助けを求めたいです。

これは私がしなければならないことです:

「プログラムを実行する必要があります。最初に、吸収する 2 次元の整数 arr [M] [N]。M - 行数 N - 列数。(行列サイズはユーザーから受け取りました) 2 つ。プログラムは補助関数を使用します。 「シフト」は、図に示すように、行列の値を右に 1 桁移動します (1 の代わりに 2、2 の代わりに 3、3 の代わりに 4、... 19 の代わりに 20、最初の 20 の代わりに入力) ). Shift は関数を作成し、サンプル マトリックス ループで 3 回呼び出す必要があります.."

例の写真: ここに画像の説明を入力

エラー メッセージ: ここに画像の説明を入力

私があきらめた問題を解決しようとした後、私のコードのどこが間違っているのかを理解するためにあなたの助けを求めたい. メモリのことですか?これは私のコードです:

#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "malloc.h"

void shift (int **arr,int rows,int cols);
void freemalloc ( int **arr,int rows);

void main()
{
    int **arr,cols,rows;
    int i,j;
    printf("please insert rows and columns of the matrix: ");
    scanf_s("%d%d",&rows,&cols);
    arr=(int **)malloc(rows*sizeof(int *));
    for(i=0; i<rows; i++)
        arr[i]=(int *)malloc(cols*sizeof(int));
    for (i=0; i<rows; i++)
        for (j=0; j<cols; j++)
        {
            printf("rows %d , cols %d :\n", i, j);
            scanf_s("%d", &arr[i][j]);
        }
    shift (arr,rows,cols);
    freemalloc (arr,rows);
    system("pause");
    return ;
}

void shift (int **arr,int rows,int cols)
{
    int i,j,temp=0;
    for(i=0; i<rows ; i++ )
        for( j=0 ; j<cols ; j++);
    {
        temp=arr[i][j];
        arr[i][j]=arr[i][cols-1];
        arr[i][cols-1]=temp;
    }
    for(i=0; i<rows ; i++)
    {
        for(j=0; j<cols ; j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
}

void freemalloc ( int **arr,int rows)
{
    int i;
    for (i=0 ; i<rows ; i++)
    {
        free(arr[i]);
    }
    free(arr);
}
4

2 に答える 2

4

私はこれを一般的なコメントで指摘しました。ここでそれを増幅します。これは間違っており、未定義の動作が発生します:

for(i=0; i<rows ; i++ )
    for( j=0 ; j<cols ; j++); // <<== this is wrong.
{
    temp=arr[i][j];
    arr[i][j]=arr[i][cols-1];
    arr[i][cols-1]=temp;
}

その末尾のセミコロンは完全に間違っています。これにより、コードは文字通り次のようになります。

// A useless nested for loop that runs `i` to `rows` and `j to `cols`
for(i=0; i<rows ; i++ )
    for( j=0 ; j<cols ; j++);

// Now `i=rows` and `j=cols`. then you do this
temp=arr[i][j];
arr[i][j]=arr[i][cols-1];
arr[i][cols-1]=temp;

未定義の動作である外部のものarrにのみインデックス付けできるため、所有していないメモリにアクセスしています。[rows-1][cols-1]

修正

for(i=0; i<rows ; i++ )
    for( j=0 ; j<cols ; j++) // note: no semi-colon.
    {
        temp=arr[i][j];
        arr[i][j]=arr[i][cols-1];
        arr[i][cols-1]=temp;
    }

そのセミコロンを削除してコードを修正すると、少なくとも問題のその部分が解決されます。他の問題について話すことはできません。

最後に、コンパイラの警告をペダンティック レベルまで有効にします。適切に高められた警告で構成された適切なコンパイラは、この問題をキャッチします。

于 2013-09-16T16:48:22.087 に答える
2

エラーは別の回答ですでに指摘されていますが、別の良いアドバイスをさせてください。多次元配列を表すためにポインタからポインタへのポインタを使用しないでください。

また、の戻り値をキャストしないでくださいmalloc()

これはあなたがすべきことです(すべきだった):

int (*mat)[width] = malloc(height * sizeof(*mat));
于 2013-09-16T17:04:28.257 に答える