2

を使用して2次元配列にメモリを割り当てるmalloc()場合、入力サイズ(行列N * N)が5(つまりN>5)より大きい場合にセグメンテーション違反が発生します。

以下のコードは、inputs(N)が。未満の場合は正常に機能し5ます。

問題を理解するのを手伝ってくれませんか。

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

int main(){
    int n;
    int i,j;
    int **adj;
    //reading size of a N*N matrix
    scanf("%d",&n);

    //dynamically allocating memory for a 2-dimensional array
    adj=(int**)malloc(sizeof(int)*n);
    for(i=0;i<n;i++){
        adj[i]=(int*)malloc(sizeof(int)*n);
    }

    //taking input from the file        
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&adj[i][j]);
        }
    }

    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d\t",adj[i][j]);
        }
        printf("\n");
    }
    return 0;
}
4

3 に答える 3

2

これは正しくありません:

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

int*ではなく、の配列を割り当てているためintです。への変更:

adj = malloc(sizeof(int*)*n); /* Cast unnecessary. */
/* or: adj = malloc(sizeof(*adj)*n); */

の戻り値をチェックscanf()して、intが正しく読み取られたことを確認することをお勧めします。

if (1 == scanf("%d", &n))
{
}

役立つ読み物:mallocの結果をキャストしますか?

于 2012-09-25T09:01:39.403 に答える
0

hmjd が指摘することに加えて、おそらくそれ以上の情報はほとんど提供されないでしょう。

int p -> p は int 型です。

int * p -> p は「int」を指すポインター (*p) 型です。

int ** p -> p は、「int へのポインター ie: (int *)」を指すポインター (*p) 型です。

左から書いて読むと分かりやすいです。

int ** adj -> 値 'int' に到達するには、2 つのポインター逆参照 ( **) が必要です。

つまり、「adj」が指すメモリ配列内の各位置は、メモリの別のチャンクのアドレスを保持する必要があります。したがって、「adj」を割り当てるときに、sizeof(int *) を指定する必要があります。

于 2012-09-25T09:18:29.690 に答える
0
adj=(int**)malloc(sizeof(int)*n);

これを

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

なぜなら、一般的にsizeof(int*) != sizeof(int)

もう 1 つのヒント: 変数を初期化します!!!

于 2012-09-25T09:04:07.483 に答える