2017-08-30 3 views
0

ich einen Puffer von Zeichen zu erzeugen versuchen wie gezeigt:mit Memcpy arbeitet für Puffer

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
struct gvk{ 
    char a ; 
    char b ; 
    char c ; 
}; 

int main(){ 
    char *buf; 
    struct gvk k = {'A','B','C'}; 

    memcpy(buf, &k , 3*sizeof(char)); 
    printf("values in buf is %s\n",buf); 
} 

Aber mein Programm wird beendet sagen „verlassen mit Nicht-Null-Status“ Wo ich falsch gemacht?

+0

'char buf [4];' ... 'sprintf (buf,"% c% c% c ", ka, kb, kc);' – BLUEPIXY

+2

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. –

+0

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 –

Antwort

2

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 VLA 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).

1

Sie müssen Speicher reservieren, bevor Sie buf verwenden, andernfalls ist es undefiniertes Verhalten.

Sie sollten es so erklären (dynamisch):

char *buf = malloc(sizeof(char)*4); 
+0

Auch der String-Terminator, wenn er'% s' zum Drucken verwenden will –

+1

'sizeof (char)' ist * immer * 1 per Definition –