2016-05-16 12 views
-1

Ich verstehe nicht, warum der letzte Code-Schnipsel 2000 und nicht 4000 druckt. Irgendein Anfängerfehler schätze ich. Wissen Sie? Verwenden von DevC++.Dereferenzieren Doppelzeiger

int val1 = 1000; 
int val2 = 2000; 
int val3[2] = {3000, 4000}; 


int **b[3]; 


*(b+0)= &val1; 
*(b+1) = &val2; 
*(b+2) = &val3; 

//Prints 1000 
//Prints what the first element of b is pointing at 
printf("%d\n",b[0][0]); 
printf("%d\n",**(b+0)); 

//Prints 2000 
printf("%d\n", b[1][0]); 
printf("%d\n",**(b+1)); 

//Prints 3000 
printf("%d\n", b[2][0]); 
printf("%d\n", **(b+2) ); 

//Should print 4000 i think, but prints 2000, why? 
printf("%d\n", b[2][1]); 
printf("%d\n", *(*(b+2)+1) ); 

EDIT: Was ich stattdessen ein Zeiger war ** b werden zu einem Array oder Zeiger, aber ich denke, was passiert ist, dass ich gemacht ** b ein Array von Zeigern-to-Zeiger wollte.

in den unten stehenden Antworten sind große Lösungen für den Code in einer Art und Weise zu arbeiten, und hier ist eine Lösung, wie Sie den Code Arbeit zu machen, wie ich ursprünglich gedacht:

Pointer to Array of Pointers

+3

alle Warnungen in Ihrem Compiler aktivieren verwenden, und geben Sie Ihren Code kompilieren. Warnungen nicht ignorieren. – dreamlax

+1

Compiler und Debugger sind deine Freunde. Schalten Sie alle Warnungen ein ... (-: – user3078414

+0

Aktivieren Sie Ihre Compilerwarnungen und pedantische Standardkonformität. Fragen Sie nicht Menschen um Rat, dass eine Maschine Ihnen kostenlos geben kann. –

Antwort

2

Dieses Programm produzieren sollte mehrere Compiler-Warnungen. Sie zu beheben, trägt viel dazu bei, das Problem zu lösen und Missverständnisse auszuräumen.

Der Typ b ist ein Array von Zeiger-zu-Zeiger-zu-int. Deshalb ist die zwei Zuordnung unten ungültig sind:

*(b+0)= &val1; 
*(b+1) = &val2; 

Sie weisen Zeiger auf int auf Zeiger-zu-Zeiger-to-int, was falsch ist.

Das Problem wird durch das Drucken eines Zeigers wird maskiert, als ob es ein int waren:

printf("%d\n", b[0][0]); 

b[0][0] ‚s Typ ein Zeiger-to- ist int, aber Sie es zu %d, sind vorbei, die sie interpretiert als ein int. Der tatsächliche Wert von b[0][0] ist jedoch int. Sie sehen also den erwarteten Wert.

das Problem zu lösen ist einfach: Änderung

int **b[3]; 
... 
*(b+2) = &val3; 

zu

int *b[3]; 
... 
*(b+2) = val3; 

Demo.

+0

Danke der Grund, warum ich den Code schrieb, wie ich tat, war, weil ich als wollte Melden Sie den Zeiger, auf den b zeigt, mit einem Zeiger an. Ich dachte, dass b auf ein Array mit 3 Zeigern zeigen würde, aber ich denke, ich habe stattdessen ein Array mit 3 Zeigern zu Zeigern erstellt. Es sollte eine einfache Lösung für das sein, denke ich. – Martin

+0

Ja, hier war es! :) http://stackoverflow.com/questions/6130712/pointer-to-array-of-pointers – Martin

0

Von einer strengen Typisierung Sicht sind die Linien:

*(b+0)= &val1; 
*(b+1) = &val2; 
*(b+2) = &val3; 

sind falsch.

Der Typ *(b+0) ist der gleiche wie der Typ b[0], der int** ist.
Typ &val1 ist int*.

Gleicher Typ stimmt nicht überein mit *(b+1).

Typ &val3 ist .

*(b+2)+1 Punkte auf Speicher, der von der Adresse der val3[1] da die Zeigerarithmetik verschieden ist, auf einem Zeiger auf einen int* durchgeführt, nicht einen Zeiger auf ein int.

In den Zeilen

printf("%d\n",b[0][0]); 
printf("%d\n",**(b+0)); 

Sie sind eine int* auf die Funktion übergeben, während der Formatangabe ein int erwartet. Dasselbe Problem existiert mit den verbleibenden printf Anweisungen. Wenn Sie gcc verwenden, verwenden Sie das Compiler-Flag -Wall, um diese Art von Problemen zu erkennen.

Sie können Ihr Problem beheben, indem

int *b[3]; 
Verwandte Themen