-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する前に値を代入するべきではないようです。
しかし、理由を教えてください。
'*(*(dp + j)+ i)' ...本当に? –
Jeez ....なんてばかしい間違い.. –
'*(x + y)'は 'x [y]'とまったく同じことを知っていますか?おそらく後者の形は目でやや簡単ですが、たぶん多分、間違いを少し早く発見することができます。 –