2016-05-07 4 views
0

Ich benutze diesen Code:C++: Wie memcpy mit Zeiger ** verwenden?

memcpy(arr[i], arr1[i], sizeof(arr1[i])); 

mit Definition:

double** arr;   // arr1 is difined the same way. 
arr = new double*[row]; 
for (int i = 0; i < row; ++i) { 
    arr[i] = new double[col]; 
    memcpy(arr[i], arr1[i], sizeof(arr1[i])); 
} 

ich es mit dem Befehl gebaut: g++ -Wall -Wextra -Wpedantic -c arr.cpp und hatte Ergebnis:

Warnung: Argument 'sizeof' in ‚void * Der Aufruf von memcpy (void *, const void *, size_t) ist derselbe Zeigertyp "double *" wie das Ziel; erwartet ‚doppelte‘ oder eine explizite Länge [-Wsizeof-Zeiger-memaccess]

memcpy(arr[i], arr1[i], sizeof(arr1[i])); 
          ^

Ich verstehe nicht, was es ist. Können Sie mir sagen, wie ich es richtig machen kann?

+0

Lesen Sie diese: http://stackoverflow.com/q/2681061/69537 – Meysam

Antwort

6

Eine kleine Visualisierung kann Ihnen helfen, die Warnung besser zu verstehen.

enter image description here

Angenommen Zeile = 2 und col = 2. Bild oben zeigt die Visualisierung von arr1[0].

In Ihrem Code memcpy(arr[i], arr1[i], sizeof(arr1[i])); ergibt die sizeof(arr1[i]) die Größe von double * (wie von @ πάντα ῥεῖ angezeigt). Wie in dem obigen Bild zu sehen ist, ist arr1[0] ein Zeiger zum Doppelten und daher kann sizeof(arr1[0]) einen Wert von 4 oder 8 annehmen, abhängig davon, ob Sie eine 32- oder 64-Bit-Anwendung ausführen.

Wenn col = 2 dann kann arr1[0] zwei doppelte Werte halten, nämlich arr1[0][0] und arr1[0][1] wie in der Abbildung gezeigt. Da Sie eine ganze Zeile kopieren möchten, müssen Sie die Länge der Bytes angeben, die von arr1[0] gehalten werden, was durch sizeof(double)*col wie von @ToddChristensen oder sizeof(arr1[i][0])*col angezeigt erreicht werden kann.

Da die Warnung, die Sie erhalten, zur Angabe einer expliziten Länge aufruft, müssen Sie unten memcpy verwenden, damit Ihre Kopieroperation korrekt funktioniert.

memcpy(arr[i], arr1[i], sizeof(arr1[i][0])*col); 

Hoffe diese Hilfe!

8

sizeof(arr1[i]) ergibt die Größe einer Zeigervariable double*, nicht die tatsächliche Größe des Array, das Sie zugewiesen haben.

Diese Warnung ist perfekt, schätzen Sie es.

2

Versuchen Sie stattdessen sizeof(double) * col. sizeof() weiß nicht, welches Argument Sie an new übergeben haben.