2016-07-17 9 views
-2

私は2つの方法を試してみましたダブルポインタmallocを変更したときにSegフォールトが発生しますが、それらの1つがsegフォールトを引き起こします。 私はなぜ.. (答えを見つけるためにしようとしましたが、これには解決の問題を見つけることができませんでした。)私はどのように私はmalloc Cのダブルポインタ

答えはここに私のコードです得ることができる場合、私はこの質問を:

1 #include <stdio.h> 
    2 #include <stdlib.h> 
    3 
    4 #define N 3 
    5 
    6 void printDPWithEarlyInit(); 
    7 void printDPWithDynamicInit(); 
    8 
    9 int main(){ 
10  printDPWithEarlyInit(); 
11  printDPWithDynamicInit(); 
12  return 0; 
13 } 
14 
15 void printDPWithEarlyInit(){ 
16  printf("### printDPWithEarlyInit() ###\n"); 
17  int** dp = malloc(N*sizeof(int*)); 
18  *(dp+0) = malloc(N*sizeof(int)); 
19  *(dp+1) = malloc(N*sizeof(int)); 
20  *(dp+2) = malloc(N*sizeof(int)); 
21 
22  for(int i=0; i<N; i++){ 
23   for(int j=0; j<N; j++){ 
24    *(*(dp+j)+i) = i*j; 
25   } 
26  } 
27 
28  for(int i=0; i<N; i++){ 
29   for(int j=0; j<N; j++){ 
30    printf("%d\t", *(*(dp+j)+i)); 
31   } 
32   printf("\n"); 
33  } 
34 } 
35 
36 void printDPWithDynamicInit(){ 
37  printf("### printDPWithDynamicInit() ###\n"); 
38 
39  int** dp = malloc(N*sizeof(int*)); 
40 
41  for(int i=0; i<N; i++){ 
42   *(dp+i) = malloc(N*sizeof(int)); 
43   for(int j=0; j<N; j++){ 
44    *(*(dp+j)+i) = i*j; 
45   } 
46  } 
47 
48  for(int i=0; i<N; i++){ 
49   for(int j=0; j<N; j++){ 
50    printf("%d\t", *(*(dp+j)+i)); 
51   } 
52   printf("\n"); 
53  } 
54 } 

私はこのプログラムを実行します。 最初のメソッドprintDPWithEarlyInit()はエラーなしで動作します。

それがプリントアウト:

しかし、第二の方法、printDPWithDynamicInit()、SEG障害を返します。 ダブルポインタで指されるすべての単一ポインタをmallocする前に値を代入するべきではないようです。

しかし、理由を教えてください。

+1

'*(*(dp + j)+ i)' ...本当に? –

+0

Jeez ....なんてばかしい間違い.. –

+0

'*(x + y)'は 'x [y]'とまったく同じことを知っていますか?おそらく後者の形は目でやや簡単ですが、たぶん多分、間違いを少し早く発見することができます。 –

答えて

0

コードはインデックスを混合します。

この

*(*(dp+j)+i) = i*j; 

は、両方の寸法が同じであるため、これが第一のスニペットには関係ありません

*(*(dp+i)+j) = i*j; 

でなければなりません。