2017-02-27 56 views
-1

此代碼給出分段錯誤。由GDB調試它給這個錯誤:動態數組中掃描值的分段錯誤(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(); 
} 

若m = 20然後,第二循環只運行12次,然後給予段故障。第一個循環運行20次。 請幫幫我。

回答

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

這應該是

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

,因爲你需要分配m指針,不m整數。或者更好,

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

(順便說一句,不要投malloc的結果。)

+0

'INT(* ARR)[2] = malloc的(M *的sizeof * ARR);'...然後*整個陣列*被分配爲一體,而不是作爲'm + 1'調用'malloc' :) – Sebivor

3

繼線有問題

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

你分配的sizeof(int)的乘以m ,這應該改爲sizeof(int *)* m來保存地址而不是int(這些可能是不同的大小,並且可能導致問題)。所以這應該是如下

scanf("%d",&m); 
arr = (int **)malloc(sizeof(int *)*m); 
    for(int i=0;i<m;i++)