Hallo pl,
sorry, aber das musste ich editieren und rot anpinseln. Dieser Code überschreibt fremden Stackspeicher. An deiner Sensibilität für Buffer-Overflows musst Du noch arbeiten. Oder Du hast mich soeben breit grinsend und erfolgreich auf die Rolle genommen 😂.
char w[4];
reserviert 4 Bytes auf dem Stack. Gültige Indexe für den Zugriff auf w[] sind also 0, 1, 2 und 3. Der Zugriff w[4]
geht auf das fünfte Byte und würde demnach das überschreiben, war "darüber" auf dem Stack liegt. Es könnte der Wert von h sein, aber auch ein geretteter Registerwert oder die Returnadresse zum Aufrufer. Das hängt vom Stackframe-Layout des Compilers und vom ABI des Betriebssystems ab.
Und wenn h z.B. den Wert 0x41420017 enthält, wird unvollständig kopiert. Eigentlich müsste man also memcpy nehmen. Aber ich denke, das ist Dir klar und darum ging's hier nicht.
So ist's richtig:
uint32_t h = 1145258561;
char w[5]; // neuer Speicherplatz mit Platz für das Terminierungsbyte
strncpy(w, (char*)&h, 4); // Kopie
w[4] = 0; // Terminierung
printf("%s\n", w); // ABCD
Oder etwas generischer:
uint32_t h = 1145258561;
char w[sizeof(h)+1]; // neuer Speicherplatz mit Platz für das Terminierungsbyte
strncpy(w, (char*)&h, sizeof(h)); // Kopie
w[sizeof(h)] = 0; // Terminierung
printf("%s\n", w); // ABCD
Rolf
sumpsi - posui - clusi