Veröffentlicht 2. März 200916 j Hallo zusammen, im rahmen meiner belegarbeit für dieses semester bin ich auf ein für mich unerklärliches kuriosum gestoßen: wenn ich eine datei mit fopen öffne, dann irgendetwas mit der funktion sprintf mache und danach fclose rufe, bekomme ich einen speicherzugriffsfehler, da der filepointer umgesetzt wurde. als (minimalisierter) c-quelltext sieht das ganze so aus: int main() { FILE *pUD; char vLen[2]; int i=12; pUD=fopen("UserData", "ab"); if(!pUD) printf("could not open file!"); printf("%i\n", (int)pUD); /*der filepointer nach int gecastet, damit man diesen kontrollieren kann*/ sprintf(vLen, "%d", i); printf("%i\n", (int)pUD); fclose(pUD); return 0; } wenn ich diese quelltext kompiliere (per gcc (SUSE Linux) 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036]) bekomm ich folgende auswurf in der konsole: 134529064 134529024 Speicherzugriffsfehler über gedanken/vorschläge, warum das so ist und wie man das am besten beheben kann, würde ich mich freuen MfG Technical.Error
2. März 200916 j Du zerschießt deinen Stack. Das Array vLen ist viel zu klein für diese Zahl. Buffer Overrun -> Undefiniertes Verhalten.
2. März 200916 j hm stimmt. vLen um eins größer und vLen[2]=0 hilft. danke für die schnelle hilfe grüße Tchnical.Error
2. März 200916 j vLen um eins größer und vLen[2]=0 hilft. Nein, das ergibt immer noch undefiniertes Verhalten. Du hast nur Glück, dass dir das nicht um die Ohren fliegt. vLen muss bei einem 32-Bit-int mindestens 12 Elemente haben.
2. März 200916 j auch für den fall, dass der int-wert definitiv maximal 2 stellen besitzt? (was bei mir der fall wäre - denn eigentlich möchte ich in vLen die länge eines strings speichern, welcher maximal 64 zeichen umfasst)
2. März 200916 j auch für den fall, dass der int-wert definitiv maximal 2 stellen besitzt?Dann reicht ein char[3]. Trotzdem solltest du snprintf benutzen, um dich vor Pufferüberläufen zu schützten.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.