2017-02-27 1 views
-1

このコードセグメンテーションフォールトを与える。 M = 20の場合は第二のループは、わずか12回実行した後、セグメンテーション障害を与えて、その後動的配列(int ** arr)のスキャン値のセグメンテーションフォルト

"Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7a6dde5 in _IO_vfscanf_internal (s=, format=, [email protected]=0x7fffffffdba8, [email protected]=0x0) at vfscanf.c:1902 1902 vfscanf.c: No such file or directory. "

void readData() 
{ 
int **arr,m; 
scanf("%d",&m); 
arr = (int **)malloc(sizeof(int)*m); 
    for(int i=0;i<m;i++) 
    { 
    arr[i] = (int *)malloc(sizeof(int) * 2); 
    } 
    for(int i=0;i<m;i++) 
    { 
    printf("..%d ..\n",i); // if m = 20 then running only 12 times 
    scanf("%d %d",&arr[i][0],&arr[i][1]); 

    } 
} 

int main() 
{ 
readData(); 
} 

:GDBによるデバッグに、このエラーを与えています。最初のループは20回実行されています。 私を助けてください。

答えて

5
arr = (int **)malloc(sizeof(int)*m); 

あなたがmポインタではなく、m int型を割り当てる必要があるので、これは

arr = malloc(sizeof(int*)*m); 

でなければなりません。以上、

arr = malloc(sizeof(*arr)*m); 

は(ちなみに、malloc関数の結果をキャストしないでください。)

+0

' INT(* ARR)[2] =のmalloc(m個*のはsizeofの*のARR)は、以下のようでなければなりません'm + 1'が' malloc'を呼び出します:) – Sebivor

3

次の行は、あなたがのsizeof(int型)回mを割り当てている

arr = (int **)malloc(sizeof(int)*m); 

問題を抱えていますこれはsizeof(int *)* mに変更して、intではなくアドレスを保持する必要があります(サイズが異なる可能性があり、問題を引き起こす可能性があります)。 `...そして*アレイ全体が*としてではなく、一つに割り当てられ、これは

scanf("%d",&m); 
arr = (int **)malloc(sizeof(int *)*m); 
    for(int i=0;i<m;i++) 
関連する問題