2013-10-18 13 views
8

Ich bin etwas verwirrt über die Parameter für die memcpy Funktion. Wenn ichMit memcpy in C++

int* arr = new int[5]; 

int* newarr = new int[6]; 

und ich möchte die Elemente in arr in newarr kopieren memcopy verwenden,

memcpy(parameter, parameter, parameter) 

Wie kann ich das tun?

+0

Welche Dokumentation haben Sie für Memcpy? –

Antwort

20

So ist die Bestellung memcpy(destination, source, number_of_bytes).

Daher können Sie die alten Daten zu Beginn des newarr mit

memcpy(newarr, arr, 5 * sizeof *arr); 
/* sizeof *arr == sizeof arr[0] == sizeof (int) */ 

oder am Ende Platz mit

memcpy(newarr+1, arr, 5 * sizeof *arr); 

Da Sie den Datentyp arr und newarr, Zeigerarithmetik kennen funktioniert. Aber innerhalb memcpy kennt es den Typ nicht, also muss er die Anzahl der Bytes wissen. Eine andere Alternative ist std::copy oder std::copy_n.

std::copy_n(arr, 5, newarr); 

Für grundlegende Typen wie int, kopieren Sie die bitweise durch memcpy getan fein arbeiten. Für tatsächliche Klasseninstanzen müssen Sie std::copy (oder copy_n) verwenden, damit der benutzerdefinierte Zuweisungsoperator der Klasse verwendet wird.

+0

@refp: Hinzufügen eines Kommentars war in Ordnung, aber es gab keine Notwendigkeit, den Code zu komplizieren. –

+0

sicher, dass die Klammern in Verbindung mit 'sizeof' möglicherweise eine stilistische Änderung an Ihrem Beitrag waren, aber ich würde es sicherlich nicht als eine Methode betrachten, es komplizierter zu machen. Konsistenz ist der Schlüssel in der Programmierung (besonders im Umgang mit Novizen, einfacher für sie), sich mit einer "Form" von "sizeof" (entschuldigen Sie meine seltsame Formulierung)) zu befassen. –

+0

Aber es gibt zwei getrennte Formen von 'sizeof' –

-6
memcpy(*newarr, *arr, sizeof(arr)); 
+3

Sie müssen nicht dereferenzieren. Das ist falsch. Können Sie eine Beschreibung hinzufügen, warum '*' erforderlich ist? –

1
memcpy(dest,src,size) 
dest -to which variable 
src - from which variable 
size - size of src varible 

int* arr = new int[5]; //source 
int* newarr = new int[6]; // destination 

for(int i = 0;i<5;i++) {arr[i] = i * 3;printf(" %d ",arr[i]);} 
memcpy(newarr,arr,sizeof(int)* 5); 
for(int i = 0;i<5;i++) printf("%d",newarr[i]); 
+5

Bitte überlegen Sie sich, eine Erklärung hinzuzufügen. – OhBeWise

+2

Während dieser Code die Frage beantworten kann, bietet zusätzlichen Kontext in Bezug auf _why_ und/oder _how_ dieser Code Antworten die Frage würde deutlich verbessern langfristigen Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung zu hinzuzufügen. –