2012-03-28 7 views
2

Ich muss das Array verschieben und ein neues Element an der angegebenen Position mit memcpy einfügen.verschieben Sie ein Array und fügen Sie ein neues Element an einer bestimmten Position mit memcpy

Input: 2, 5, 7, 0, 0, 0 

Expected output: 2, 3, 5, 7, 0, 0 

Actual output: 2, 3, 5, 0, 0, 0 

Gibt es einen Fehler in meinem memcpy? (Ich habe Arrays zu verwenden - nicht std::vectors)

#include <stdio.h> 
int main() 
{ 
    int i=0; 
    int len=0; 
    int a[6] = {'\0'}; 
    a[0]= 2; 
    a[1] = 5; 
    a[2]= 7; 
    len=3; 
    int b=0; 
    b = 2; 
    memcpy(a+2, a+1, b * sizeof(int)); 
    //memcpy(a+2, a+1, sizeof(int) * (len-1)); 
    a[1]=3; 
    for(i=0;i<6;i++) 
     printf("after %d \n", a[i]); 
} 
+3

Vielleicht brauchen Sie bei Verwendung zu suchen: 'memmove' anstatt' Memcpy '? – GWW

+0

Die Operation von memcpy, wenn sich die Regionen überlappen, ist nicht definiert. – stark

+0

Vielleicht sollten Sie 'std :: copy' anstatt 'memcpy' oder' memmove' betrachten? –

Antwort

6

Vom Manpage memcpy:

Die Speicherbereiche überlappen nicht. Verwenden Sie memmove (3), wenn sich die Speicherbereiche überschneiden.

Und der Vollständigkeit halber, aus dem C99-Standard:

Wenn das Kopieren zwischen Objekten erfolgt, die sich überlappen, ist das Verhalten nicht definiert.

+0

Das funktioniert! Vielen Dank. Dieser memove sollte gut halten, auch wenn meine Eingabe 2, 5, 7, 9, 11, 12 und ich 3 an Position 1 einfügen, richtig? vorausgesetzt, ich überprüfe die Randbedingungen. – swap

0

Sie kopieren tatsächlich die 5 (a[1]) über richtig, aber es ist das Schreiben über die 7 (a[2])

Sie müssen einen anderen Memcpy hinzufügen über zuerst die 7 Eintrag zu kopieren, und dann sind Sie kann die 5 über kopieren.

Da Sie technisch Bewegungs Speicher sind jedoch würde ich vorschlagen, was Mike Seymour sagte, und machen Sie einen memmove:

http://www.cplusplus.com/reference/clibrary/cstring/memmove/

Verwandte Themen