Thread u.a. Adressierungsoperator (7 answers)
Opened by RPerl at 2007-10-27 19:18

RPerl
 2007-10-27 22:04
#101483 #101483
User since
2006-11-26
384 articles
BenutzerIn

user image
Quote
Mit char *str[1024]; deklarierst Du ein Feld von 1024 Zeigern auf Zeichen, dann aber sagst Du mittels sprintf(&str[0], ...); "Nimm das erste Element des Feldes str -- also den ersten Zeiger -- berechne seine Adresse, konvertiere diese Adresse implizit vom Typ Zeiger auf Zeiger auf Zeichen in den Typ Zeiger auf Zeichen und speichere dort die Zeichenkette, die sprintf berechnet". Das ist -- wegen der Typkonversion -- eine komische Anweisung, die Dein Compiler vermutlich auch angemeckert hätte, wenn Du vorsichtigerweise mit eingeschalteten Warnungen kompiliert hättest.

Ok - wenn ich nur:

char str[1024]

mache, bekomme ich wieder eben falsche Werte.
Output:
Code: (dl )
1
2
3
---
INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2,INSERT INTO data (v1, v2, v3, v4) VALUES ('127.0.0.1', 'hostname', 'port', 'test')
---

Ueberlappung.

Wenn ich oberes lasse, bekomme ich:

Quote
warning: passing argument 1 of ‘sprintf’ from incompatible pointer type
zwar eine Warnung, aber der code tut was er tun soll.

Also was soll ich tun? Die Warnung hinnehmen, was ich persoenlich nicht gut finde, oder diesen Fehler suchen und auch noch ausmerzen?

Quote
Das Programm verhält sich genau so, wie es sollte, allerdings verletzt Du hier die strikte Typisierung der Zeiger, was schlechter Stil ist, und Du führst keinerlei Überprüfungen von Zeichenkettenlängen durch, um Pufferüberläufe zu verhindern, was noch viel schlechterer Stil ist.

Darum kuemmer ich mich natuerlich sowieso noch. *g*

Ich haette fuer die query Generierung auch Bind parameter von mysql.h nutzen koennen, aber dafuer haet ich umstaendlicherweise eine Struktur erstellen muessen - das ist etwas "oversized".

Tausend Dank fuer deine freundlichen Tipps, Erklaerungen und Verbesserungen!

View full thread u.a. Adressierungsoperator