2016-08-06 18 views
1

Ich bin neu in der Programmierung und war nur mit einigen Funktionen herumspielen, wollte ich die memcpy() Funktion testen, aber mein Code einfach nur bricht, ohne tatsächlich einen Fehler zu werfen, können Sie mir bitte sagen, was ich falsch mache?Was ist falsch an diesem Code-Schnipsel?

int main() 
{ 
    char *psz = "Hello world!"; 
    char dst[1024]; 

    memcpy(psz, dst, sizeof(psz)); 

    return 0; 
} 
+0

Welche Fehler actually' –

+0

Sie nicht kopieren können den Speicher statisch zugeordnet. –

+0

Es wird kein Fehler ausgegeben, es heißt nur Unhandled Ausnahme bei 0x0F980E9A (msvcr110d.dll) ' –

Antwort

2

Ihre ersten beiden Parameterwerte von memcpy() nach hinten sind. Der erste Parameter von memcpy() ist das Ziel, der zweite Parameter ist die Quelle. Sie versuchen, einen lokalen (nicht initialisierten) Puffer in den Speicher eines Zeichenfolgenliterals zu kopieren. Ein String-Literal wird im Nur-Lese-Speicher gespeichert, weshalb Sie einen Laufzeitfehler erhalten.

Auch Ihre Verwendung ein sizeof() ist falsch, auch. psz wird als Zeiger deklariert. Die Größe eines Zeigers beträgt bei einem 32-Bit-System 4 Byte und bei einem 64-Bit-System 8 Byte. Wenn Sie Ihre Pufferparameter umkehren, würden Sie auf einem 32-Bit-System kopieren, und auf einem 64-Bit-System würden Sie Hello wo kopieren.

Ich vermute, Sie soll die folgende stattdessen tun:

memcpy(dst, psz, strlen(psz)+1); 

Oder vielleicht:

char psz[] = "Hello world!"; 
char dst[1024]; 

memcpy(dst, psz, sizeof(psz)); 
+1

strlen (psz) +1 ist besser, um das Zeichen '\ 0' zu erhalten –

1

Das Ziel psz verweist auf eine konstante Zeichenfolge. So wird der Fehler gemeldet. Wahrscheinlich möchten Sie dies tun memcpy (dst, psz, sizeof (psz));

1

Werfen Sie einen Blick auf die memcpy documentation.

Die korrekte Verwendung ist

memcpy (destination, source, num); 

nicht

memcpy (source, destination, num); 
Verwandte Themen