Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Pointer Fehlersuche. » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Pointer Fehlersuche.
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Nunzio
Jungspund


Dabei seit: 18.04.2013
Beiträge: 13

Pointer Fehlersuche. Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Grüße, ich hab hier eine Aufgabe mit Pointern. Dort sind kleine Programmausschnitte gegeben wo Fehler drin stecken und ich soll die Fehler erkennen und diese einordnen. Diese Fehler gibt es :
I. Dereferenzierung eines nicht initialisierten Zeigers ("zeigt irgendwohin").
II. Zeiger zeigt auf nicht initialisierte Variable.
III. Wertzuweisung an Zeiger mit inkompatiblem Datentyp.
IV. Versuch, einer Feldvariable eine neue Adresse zuzuweisen.

Das wäre der Ausschnitt Nummer 1.

int main()
{
int zahl = 33, *q;
q = zahl;
printf("%i", *q);
return 0;
}

Ich weiß, dass das & vor zahl fehlt, aber ich bin mir nicht so richtig sicher, welcher Fehler das ist. Ich würde sagen das wäre Fehler 1, weil der Zeiger ja erstellt wird, aber nicht halt nicht richtig .. mit Daten gefüttert sag ich jetzt mal. Hab' ich das jetzt richtig so gemacht? Komme auch mit dem Ausdruck dereferenzieren nicht so recht klar. Ich hoffe mir kann jemand helfen, liebe Grüße!
20.01.2016 18:33 Nunzio ist offline E-Mail an Nunzio senden Beiträge von Nunzio suchen Nehmen Sie Nunzio in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Dereferenzieren heißt dahin gehen, wo der Zeiger hinzeigt. Wenn in den Zeiger noch nichts reingeschrieben wurde, kann da nichts gutes rauskommen.

Ich hätte auch die 1 genommen, beim printf trifft das zu.

__________________
Syntax Highlighting fürs Board (Link)
20.01.2016 19:32 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Nunzio
Jungspund


Dabei seit: 18.04.2013
Beiträge: 13

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Vielen Dank für deine Antwort erstmal. Ich habe noch 7 weitere kleine Ausschnitte.

2.
int main()
{
char zeichen, *p;
p = &zeichen;
printf("%c", *p);
return 0;
}

p wird hier auf zeichen umgebogen, bzw. zeigt auf zeichen. (sagt man das so?) Zeichen wurde aber nicht initialisiert, also würde ich hier Fehler II sagen.

3.
int main()
{
double d, *p;
*p = 77;
printf("%f", *p);
return 0;
}

Hier zeigt der Zeiger noch "irgendwohin", wurde also noch nicht initialisiert. (Fehler I) Zusätzlich vermute ich, das da nichts gutes bei rumkommen kann, wenn man jetzt versucht einen nicht initialisierten Zeiger mit einer Variable zu füttern. Deswegen würde ich hier auch noch Fehler IV hinschreiben.

4.
int main()
{
int zahl = 5;
double *p;
p = &zahl;
printf("%i", *p);
return 0;
}

hier wird ein Zeiger vom Datentyp double * auf eine int-adresse umgebogen und das ist Fehler III. Allerdings klappt es in auf meinem Computer trotzdem. großes Grinsen

5.
int main()
{
int v[2], *p;
p = v;
printf("%i", *p);
return 0;
}

Die einzelnen Bestandteile des Feldes wurden nicht initialisiert und p zeigt jetzt auf die erste Adresse des Arrays. (richtig?) Also ist das hier Fehler II. Ich kann mir allerdings nicht erklären, wieso da 0 rauskommt.

6.
int main()
{
char v[] = {1, 2, 3}, w[3];
char *p;
p = v;
w = p;
printf("%c", w[0]);
return 0;
}

Hier bin ich mir nicht sicher. p allein enthält ja die Adresse auf die gezeigt wird. Wird also versucht der ersten Feldvariable eine neue Adresse zu geben? Ich habe einfach Fehler IV angegeben. Könnte auch sein das der adresswertige Ausdruck nicht kompatibel zu w ist, daher will ich Fehler III nicht ausschließen.

7.
int main()
{
int v[2];
*v = 1;
v++;
*v = 2;
printf("(%i,%i)", v[0],
v[1]);
return 0;
}

Hier wird versucht die Adresse zu inkrementieren. (vermute ich) Also wird versucht die Adresse der ersten Feldvariable zu ändern, was ja nur schiefgehen kann. Fehler IV.

8.
code:
1:
2:
3:
4:
5:
6:
7:
int main()
{ 
char v[] = {65, 66}, *p;
p = v[0]; 
printf("%c", *p); 
return 0;  
}

Hier zeigt der Zeiger auf einen inkompatiblen Datentyp und somit ist der Zeiger auch nicht korrekt initialisiert worden. Fehler I und III.

Vielen Dank im Voraus. EDIT : Hab jetzt rausgefunden, wie ich den Code ansprechender einfügen kann, ab jetzt mache ich das immer so. Ich hoffe man kann jetzt noch drüber hinwegsehen, ist ja kein umfangreicher Code.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Nunzio: 21.01.2016 16:31.

21.01.2016 16:28 Nunzio ist offline E-Mail an Nunzio senden Beiträge von Nunzio suchen Nehmen Sie Nunzio in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

2. ok
3. IV hast du da nicht. (siehe 6.)
4. kommt drauf an, was man unter "klappt" versteht. Ich kriege als Ausgabe "-1766966216"
5. die 0 ist Zufall. Bei mir kommt -1826597888 raus.
6. mit w = p würdest du das komplette Array verschieben. Der gcc kompiliert das nichtmal: error: incompatible types when assigning to type ‘char[3]’ from type ‘char *’ - w = p;
Fehler IV
7. Ja, hier würde wieder das komplette Array verschoben werden.
8. ok

__________________
Syntax Highlighting fürs Board (Link)
21.01.2016 20:31 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Nunzio
Jungspund


Dabei seit: 18.04.2013
Beiträge: 13

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke für deine Antwort. Haben heute die Lösung bekommen und dort steht drin, das der erste Programmabschnitt den Fehler III enthält, aber ich verstehe nicht wieso. Ist das nicht falsch?
23.01.2016 17:16 Nunzio ist offline E-Mail an Nunzio senden Beiträge von Nunzio suchen Nehmen Sie Nunzio in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Doch, das stimmt.
Es wird einem int* ein int zugewiesen (die Adresse mit einer Zahl überschrieben, statt mit einer anderen Adresse). In der Folge gibt es dann aber trotzdem Fehler 1.
Mit p = &zahl; könnte man aber beides auf einmal richten.

__________________
Syntax Highlighting fürs Board (Link)
23.01.2016 17:28 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Pointer Fehlersuche.