Pointer Fehlersuche.

Neue Frage »

Auf diesen Beitrag antworten »
Nunzio Pointer Fehlersuche.

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!
 
Auf diesen Beitrag antworten »
eulerscheZahl

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.
Auf diesen Beitrag antworten »
Nunzio

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.
Auf diesen Beitrag antworten »
eulerscheZahl

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
 
Auf diesen Beitrag antworten »
Nunzio

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?
Auf diesen Beitrag antworten »
eulerscheZahl

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.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »