2016-10-09 2 views
1

Ich muss eine Funktion schreiben, die eine tiefe Kopie eines Arrays von Ganzzahlen macht, mit nur Zeigerarithmetik (dh kann Array-Element-Syntax wie orig [i] nicht verwenden).Tiefe Kopie eines Arrays von ganzen Zahlen, nur mit Zeigerarithmetik

Das erste Argument ist das Array zu kopieren, und seine Länge wird durch das zweite Argument angegeben. Hier

ist das, was ich bisher:

int* copyArray(const int *orig, int size) { 

    int *copy = malloc(size * sizeof *copy); 

    int **toReturn = © 

    for (int i = 0; i < size; i++, orig++, copy++) { 
    *copy = *orig; 
    } 

    return *toReturn; 

} 

int main() { 

    int testArray[3] = {1, 2, 3}; 
    int *testptr = testArray; 

    int *copied = copyArray(testptr, 3); 

    for (int i = 0; i < 3; i++) { 

    printf("%d %p", testArray[i], &testArray[i]); 
    printf("\n"); 

    } 

    printf("\n"); 

    for (int i = 0; i < 3; i++) { 

    printf("%d %p", copied[i], &copied[i]); 
    printf("\n"); 

    } 

return 0; 
} 

Dies ist nicht mir, die richtigen Ergebnisse zu erzielen ... Das Ergebnis, das ich von diesem erhalten ist:

1 0x7ffce0ff6fd0 
2 0x7ffce0ff6fd4 
3 0x7ffce0ff6fd8 

0 0xe1301c 
0 0xe13020 
0 0xe13024 

während es sein sollte sein:

1 0x7ffce0ff6fd0 
2 0x7ffce0ff6fd4 
3 0x7ffce0ff6fd8 

1 0xe1301c 
2 0xe13020 
3 0xe13024 

ich auf Zeiger und Speicherzuweisung bin neu ... Was mache ich falsch?

UPDATE: Problem behoben!

Schauen Sie sich meine Antwort an, oder die anderen Antworten, die auch funktionieren.

+2

Sie Inkrementieren 'copy', so dass, wenn Sie es zurück, es zeigt auf das Ende des Arrays. Außerdem weisen Sie nur 3 Byte Speicher zu; es sollte 'malloc (Größe * Größe von * Kopie)' sein. Drittes Problem gefunden: benutze 'size' in der for-Schleife in' copyArray() ', nicht' 3'. – potrzebie

+0

Dank @ potrzebie! Ich habe die von Ihnen empfohlenen Änderungen vorgenommen ... aber ich bekomme immer noch das gleiche Ergebnis. Ich bin mir nicht sicher, ob ich die richtige Änderung an der Return-Anweisung vorgenommen habe. Bitte guck dir das an! AKTUALISIERT. – RockAndaHardPlace

+1

@RockAndaHardPlace Sie können die Zeile 'copy ++' nicht verwenden. Das ändert den Wert, den Sie zurückgeben. Der Wert von 'copy', den Sie von' malloc' erhalten, muss * unverändert * von Ihrer 'copyArray' Funktion zurückgegeben werden. –

Antwort

2

ändern copyArray zu so etwas wie

int *copyArray(const int *orig, size_t size) 
{ 
    int *copy = malloc(size * sizeof(*copy)); 

    for (size_t ii = 0; ii < size; ii++) 
    { 
     copy[ ii ] = orig[ ii ]; 
    } 
    return(copy); 
} 

Stilistisch Ich mag persönlich ii statt i. Es ist schwer nach i zu suchen. Und size_t ist eine bessere Wahl als int für etwas, das verwendet wird, um die Größe von etwas zu beschreiben.

Sie sollten wahrscheinlich einige Fehlerprüfung hinzufügen, sollte mallocNULL zurückgeben.

Und ohne den Zeiger Indizierung (weil einfacher Code ist verboten werden?!?)

int *copyArray(const int *orig, size_t size) 
{ 
    int *copy = malloc(size * sizeof(*copy)); 

    memcpy(copy, orig, size * sizeof(*copy)); 
    return(copy); 
} 

ohnehin wahrscheinlich schneller ist. Die richtige Header-Einfügung bleibt als eine Größe für den Leser übrig ... ;-)

Es muss jedoch noch eine Fehlerüberprüfung durchgeführt werden.

+0

Danke! Das wird höchstwahrscheinlich funktionieren, aber ich darf keine Array-Element-Syntax wie copy [ii] verwenden, wie ich in der Frage erwähnt habe. – RockAndaHardPlace

+1

@RockAndaHardPlace * Ich darf keine Array-Element-Syntax wie copy [ii] verwenden, wie ich in der Frage erwähnt habe. * OK, ich werde nicht fragen * warum *. Einfache Lösung auf dem Weg .... –

+0

Nochmals vielen Dank, @AndrewHenie! – RockAndaHardPlace

1

Dies ist eine Arbeitsversion der Copyarray-Funktion:

int* copyArray(const int *orig, int size) { 

    int *copy = malloc(size * sizeof *copy); 

    int *toReturn = copy; 

    for (int i = 0; i < size; i++, orig++, copy++) { 
    *copy = *orig; 
    } 

    return toReturn; 

}