Hi,
ich experimentiere gerade etwas mit Pointern rum und bin dabei auf ein Problem gestoßen was ich mir gerade einfach nicht erklären kann. Ich will einen binären Baum basteln (unter jeden Knoten folgen 2 weitere Knoten, links kleiner als der jeweilige Knoten, rechts größer) an den ich dann neue Knoten Hinzufügen kann, Knoten löschen kann, Knoten ausgeben kann etc.
Der Code der darin steht ist denk ich erstmal irrelevant, weil nach meiner Auffassung schon da eine diskrepanz entsteht.
Ich deklariere also einen Zeiger first der auf den Typ tree_t zeigt und initialisiere ihn mit NULL. first zeigt nun also an eine Stelle im Speicher, an der nichts (NULL) steht.
Wenn ich nun aus der main die Funktion addDataToTree(int data) aufrufe, ruft diese die überladene Funktion addDataToTree(tree_t *node, int data) auf und übergibt ihr zum einen den Integerwert von data, und zum Anderen, den Pointer first, also die Adresse im Speicher wo der Baum "beginnen" soll.
Nach meiner Auffassung her, müssten first und node nun auf die gleiche Adresse zeigen oder? Das tun sie aber nicht! Beide zeigen auf eine andere Adresse (via printf ermittelt)
Ich habe auch schon probiert, die überladene Funktion statt mit addDataToTree(first, data) mit addDataToTree(&first, data) aufzurufen, aber da meckert VisualStudio rum ("IntelliSense: Keine Instanz von Überladene Funktion "addDataToTree" stimmt mit der Argumentliste überein. Argumenttypen sind: (tree_t **, int)")
Habe ich da einen Denkfehler? ODer ist es einfach schon zu spät?
Grüße
ich experimentiere gerade etwas mit Pointern rum und bin dabei auf ein Problem gestoßen was ich mir gerade einfach nicht erklären kann. Ich will einen binären Baum basteln (unter jeden Knoten folgen 2 weitere Knoten, links kleiner als der jeweilige Knoten, rechts größer) an den ich dann neue Knoten Hinzufügen kann, Knoten löschen kann, Knoten ausgeben kann etc.
Code:
struct tree { /*Datentyp für jeden Knoten*/
int data; /*Der Wert des Knotens*/
struct tree *pLeft; /*Knoten eine Ebene tiefer links (kleiner)*/
struct tree *pRight; /*Knoten eine Ebene tiefer rechts (größer)*/
struct tree *pRoot; /*der Knoten über dem aktuellen Knoten*/
};
typedef struct tree tree_t;
static tree_t *first;
void init_tree(){
first = NULL;
if(first == NULL)
printf("SUCCESS! first wurde NULL gesetzt\n\n");
else
printf("ERROR!first wurde nicht NULL gesetzt\n\n");
}
void addDataToTree(int data){
addDataToTree(first, data);
}
void addDataToTree(tree_t *node, int data){
printf("\nnode: %p first: %p\n", &node, &first); /*Müsste nun nicht 2x exakt die gleiche Adresse angezeigt werden?*/
/*hier folgt dann Code...*/
}
int main(void){
init_tree();
addDataToTree(5);
}
Der Code der darin steht ist denk ich erstmal irrelevant, weil nach meiner Auffassung schon da eine diskrepanz entsteht.
Ich deklariere also einen Zeiger first der auf den Typ tree_t zeigt und initialisiere ihn mit NULL. first zeigt nun also an eine Stelle im Speicher, an der nichts (NULL) steht.
Wenn ich nun aus der main die Funktion addDataToTree(int data) aufrufe, ruft diese die überladene Funktion addDataToTree(tree_t *node, int data) auf und übergibt ihr zum einen den Integerwert von data, und zum Anderen, den Pointer first, also die Adresse im Speicher wo der Baum "beginnen" soll.
Nach meiner Auffassung her, müssten first und node nun auf die gleiche Adresse zeigen oder? Das tun sie aber nicht! Beide zeigen auf eine andere Adresse (via printf ermittelt)
Ich habe auch schon probiert, die überladene Funktion statt mit addDataToTree(first, data) mit addDataToTree(&first, data) aufzurufen, aber da meckert VisualStudio rum ("IntelliSense: Keine Instanz von Überladene Funktion "addDataToTree" stimmt mit der Argumentliste überein. Argumenttypen sind: (tree_t **, int)")
Habe ich da einen Denkfehler? ODer ist es einfach schon zu spät?
Grüße