QT 3.3.3 & VS 2008
-
Hallo zusammen,
ich portiere grade ein größeres Projekt von VS 6.0 auf VS 2008 und Vista. Das Projekt ist in C++ und Qt 3.3.3 geschrieben. Nun treten nach erfoglreichem Erstellen bei einem "simplen" Zeigerzugriff (der auch gültig ist) eine Zugriffsverletzung auf. Der gleiche Zugriff ohne Qt funktioniert.
Hat vielleicht jemand einen Gedankenanstoss was das sein könnte.Hier noch ein Beispiel, das in Kurzform zu dem Absturz führt:
#include <stdlib.h> #include <qapplication.h> #include <qlabel.h> int main(int argc, char** argv) { char* name = "test.txt"; char* p = 0; QApplication* app = new QApplication(argc, argv); QLabel* l = new QLabel(NULL, "TEST"); app->setMainWidget(l); p = strchr(name, '.'); if (p) { *p = 0; // <== Absturz } l->show(); app->exec(); return 0; }
Die Fehlermeldung:
Unbehandelte Ausnahme bei 0x00811a94 in Qt-Tester.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00814a58.
In dem Zeiger steht laut Debugger ".txt".
Vielen Dank
mike
-
p ist ein char*, also ein Zeiger auf eine Zeichenkette und *p dereferenziert auf char,
-
Hallo Softwaremaker,
char* ist ein Zeiger auf char, aber das ist zunächst mal nur ein Zeiger auf ein Zeichen und es kann sein, muss aber nicht, das dann noch weitere folgen (also eine Zeichenkette). Die Dereferenzierung auf den Zeiger liefert aber in jedem Fall immer das Zeichen, das an der referenzierten Stelle steht:
z.B:// Ein Zeichen char aChar = 'a'; char* aCharZeiger = &aChar; // *aCharZeiger entspr. 'a' // Eine Zeichenkette char* aZeichenkette = "Tolle Zeichenkette"; char* aCharZeiger = &aZeichenkette; // *aCharZeiger entspr. 'T'
Da war vielleicht meine Formulierung
In dem Zeiger steht laut Debugger ".txt".
etwas irreführend. In *p steht '.'.
Trotzdem danke und in der Hoffnung auf weitere Ideen.
Gruß
Michael
-
Das ist jetzt reine Spekulation:
Da du name gleich mit einem fixen (const) String initialisierst, duerfte der Compiler diesen konstanten String in einem nicht-beschreibbaren Bereich des Speichers ablegen. strchr liefert einen Pointer auf diesen (nicht schreibbaren) Bereich, und du versuchst, via dieses Pointers doch in den Bereich zu schreiben.
Wenn du den Code mit dem GCC kompilierst, schreit dieser dann auch
test.cpp:7: warning: deprecated conversion from string constant to ‘char*’
(wobei Zeile 7 die Zuweisung an name ist).
EDIT: dass das Ganze ohne Qt laeuft, wuerd ich auf Zufall schieben. Bei mir stuerzt der Testcode auch ohne Qt mit einem segfault ab.
-
das mit dem schreibgeschützen Puffer wars, vielen Dank