*gelöst* Zeiger auf gleiche Adresse dereferenziert verschiedene Werte
-
Ich habe schon lange kein C mehr benutzt und versuche gerade mit alten Übungsaufgaben aus meinem Studium mein Wissen wieder aufzufrischen.
Hier die Aufgabenstellung:
Schreiben Sie ein Programm mit zwei Arrays a und b, die jeweils fünf int-Werte aufnehmen können. Das Array a soll unmittelbar bei seiner Definition mit Werten vorbesetzt werden. Das Programm soll dann die Werte von a nach b kopieren und dabei ihre Reihenfolge umkehren. Zum Abschluss soll es den Inhalt von b auf den Bildschirm ausgeben. Beim Zugriff auf die Arraykomponenten soll nicht die Schreibweise mit eckigen Klammern [ ], sondern die Zeigerarithmetik benutzt werden.So weit so gut. Das habe ich gemacht und es hat auf Anhieb funktioniert. Dann wollte ich die Ausgabe aber in eine eigene Funktion auslagern.
Hier fängt es dann an komisch zu werden.
Hier mal die Ausgabe:
Funktion Array A: 1 2 3 4 5 Funktion Array A: 0028fefc 0028ff00 0028ff04 0028ff08 0028ff0c Funktion Array B: 5 6 7 8 9 Funktion Array B: 0028fee8 0028feec 0028fef0 0028fef4 0028fef8 Array A: 1 2 3 4 5 Array A: 0028fefc 0028ff00 0028ff04 0028ff08 0028ff0c Array A: 0028fefc 0028ff00 0028ff04 0028ff08 0028ff0c Array B: 5 4 3 2 1 Array B: 0028fee8 0028feec 0028fef0 0028fef4 0028fef8 Array B: 0028fee8 0028feec 0028fef0 0028fef4 0028fef8 Process returned 9 (0x9) execution time : 0.024 s Press any key to continue.
Die Ausgabe des Arrays B über die Funktion geschieht nicht wie gedacht. Die ursprüngliche Ausgabe, die in der main-Funktion definiert ist, funktioniert hingegen. Man sieht ja auch, dass die Adressen immer gleich sind. Daher bin ich etwas verwundert darüber, warum die Funktion mir den Inhalt von B als "5 6 7 8 9" ausgibt.
Ich habe vermutlich irgendeinen ganz dummen Denkfehler gemacht haben. Aber ich bin gerade irgendwie blind und komme nicht dahinter. Würde mich sehr freuen, wenn ihr mich über meinen Fehler aufklären könntet.
Hier mein Code:
#include <stdio.h> #define DEBUG void print_array(int *array, int length, char *name) { int i; printf("Funktion %s: ", name); for(i=0; i<length; i++) { printf("%d ", *array+i); } printf("\n"); #ifdef DEBUG printf("Funktion %s: ", name); for(i=0; i<length; i++) { printf("%p ", array+i); } printf("\n"); #endif } int main(void) { int a[5] = { 1,2,3,4,5 }; int b[5]; int *a_ip, *b_ip; /* Inhalt von Array A in verkehrter Reihenfolge in Array B kopieren */ int i, j=0; for(i=4; i>=0; i--) { a_ip = a+i; b_ip = b+j; *b_ip = *a_ip; j++; } /* Ausgabe der Werte von Array A und B via Funktionsaufruf */ print_array(a, 5, "Array A"); print_array(b, 5, "Array B"); /* Ausgabe der Werte von Array A */ printf("Array A: "); for(i=0; i<5; i++) { a_ip = a+i; printf("%d ", *a_ip); } printf("\n"); #ifdef DEBUG /* Ausgabe der Speicheradressen des Arrays A */ /* Hier doppelt gemoppelt, weil ich Umgang mit Zeigern ueben wollte */ printf("Array A: "); for(i=0; i<5; i++) { a_ip = a+i; printf("%p ", a_ip); } printf("\n"); printf("Array A: "); for(i=0; i<5; i++) { printf("%p ", a+i); } printf("\n"); #endif /* Ausgabe der Werte von Array B */ printf("Array B: "); for(i=0; i<5; i++) { b_ip = b+i; printf("%d ", *b_ip); } printf("\n"); #ifdef DEBUG /* Ausgabe der Speicheradressen des Arrays B */ /* Hier doppelt gemoppelt, weil ich Umgang mit Zeigern ueben wollte */ printf("Array B: "); for(i=0; i<5; i++) { b_ip = b+i; printf("%p ", b_ip); } printf("\n"); printf("Array B: "); for(i=0; i<5; i++) { printf("%p ", b+i); } #endif }
edit: Uuund jetzt bin ich natürlich selbst drauf gekommen. So wie es fast immer ist, wenn ich im Forum nach Hilfe suche.
Der Fehler hatte sich in Zeile 8 eingeschlichen. Hier steht *array+i. Also wurde der Zeiger erst dereferenziert und auf den Wert wurde dann der Wert von i addiert. Wenn man *(array+i) schreibt wird auch wie gewünscht die Speicheradresse verrechnet und nicht der Wert.
-
Deswegen benutzt man auch den subscript operator [], dann passiert sowas nicht;
das wissen natürlich Laien-Professoren nicht und stellen solche schwachsinnigen Aufgabenstellungen.