2016-07-17 9 views
-2

Ich habe versucht, zwei Möglichkeiten, malloc Doppelzeiger, aber einer von ihnen verursacht seg Fehler. Ich stelle diese Frage, wenn ich eine Antwort bekommen kann, warum .. (versucht, eine Antwort zu finden, konnte aber nicht eine Frage gelöst zu diesem Thema finden.)Seg Fehler wird verursacht, wenn ich ändere, wie ich malloc ein Doppelzeiger in C

Hier ist mein Code:

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 } 

Wenn Ich starte dieses Programm, die erste Methode, printDPWithEarlyInit(), funktioniert ohne einen Fehler.

Es druckt:

Aber die zweite Methode, printDPWithDynamicInit(), kehrt seg Fehler. Es scheint, dass ich keinen Wert vor malloc allen einzelnen Zeigern zuweisen sollte, auf die der Doppelzeiger zeigt.

Aber könnten Sie bitte erklären warum?

+1

'* (* (dp + j) + i)' ... wirklich? –

+0

Jeez .... was für ein dummer Fehler .. –

+0

Wissen Sie, dass '* (x + y)' ist genau das gleiche wie 'x [y]'? Vielleicht ist die letztere Form etwas leichter für die Augen und vielleicht, nur vielleicht, würde es erlauben, den Fehler ein kleines bisschen schneller zu erkennen. –

Antwort

0

Der Code mischt die Indizes.

Diese

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

sollte

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

sein Da beide Dimensionen gleich sind dies für den ersten Schnipsel nicht relevant ist.

Verwandte Themen