Collegue ober Ihnen gesagt Speicher dynamisch zugewiesen werden, aber da seine viel mehr fehleranfällig, härter mit arbeiten (zum kostenlosen müssen Speicher) dann mit automatischen Arrays + Sie wissen, die Größe in Kompilierzeit, gibt es keinen Grund, dynamische Zuordnung zu verwenden. Ich würde empfehlen, stattdessen das automatische Array zu verwenden. Vergessen Sie auch nicht für ein Byte für nullende Zeichen.
char buf[4];
Wir verwenden dynamische Zuordnung nur, wenn es keinen anderen Weg gibt. Auch wenn Sie die Größe des Arrays in der Kompilierzeit nicht kennen, können Sie c99VLA verwenden.
Auch Compiler fügen padding zwischen/hinter struct Elemente können. Padding aligns Struktur Mitglieder zu "natürlichen" Adressgrenzen.
In Ihrem Fall wäre es wahrscheinlich so aussehen
struct gvk{
char a ; // 1B
char b ; // 1B
char c ; // 1B
// 1B padding
};
was in diesem Fall bedeutet, sollte es gut funktionieren, trotzdem sollten Sie die Verwendung memcpy(buf, &k , 3*sizeof(char));
auf Strukturen wie dies vermeiden, weil Sie padding kopieren könnte statt echtes Element der Struktur.
Auch gibt es keine Notwendigkeit, explizit sizeof(char)
zu geben, die durch Standard, Größe hat 1 (B).
'char buf [4];' ... 'sprintf (buf,"% c% c% c ", ka, kb, kc);' – BLUEPIXY
Sie müssen Speicher für den 'buf' reservieren und auch terminieren mit einem '\ 0', wenn Sie'% s' zum Drucken verwenden möchten. Außerdem ist es keine gute Idee anzunehmen, dass 'sizeof (gvk)' 3 Bytes ist. –
Lesen Sie mehr über [undefined Verhalten] (https://en.wikipedia.org/wiki/Undefined_behavior) und arbeiten Sie hart, um es zu vermeiden. Kompiliere mit allen Warnungen und Debug-Informationen ('gcc -Wall -Wextra -g' mit [GCC] (http://gcc.gnu.org/) ...). Lernen Sie, den Debugger ('gdb') und [valgrind] (http://valgrind.org/) zu verwenden –