2016-05-07 70 views
0

我用這個代碼:C++:如何使用memcpy與指針**?

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

與定義:

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])); 
} 

我用命令建立它:g++ -Wall -Wextra -Wpedantic -c arr.cpp並有結果:

警告:在「無效參數 '的sizeof' * memcpy(void *,const void *,size_t)'調用與目標相同的指針類型'double *';預期「雙倍」或明確的長度[-Wsizeof-pointer-memaccess]

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

我不明白它是什麼。你能告訴我如何使它正常工作?

+0

閱讀此:http://stackoverflow.com/q/2681061/69537 – Meysam

回答

6

小型可視化可以幫助您更好地理解警告。

enter image description here

假設行= 2和col = 2.以上圖爲arr1[0]可視化。

在您的代碼memcpy(arr[i], arr1[i], sizeof(arr1[i]));中,sizeof(arr1[i])的產量爲double *的大小(如@πάνταῥεῖ所示)。如上圖所示,arr1[0]是一個雙倍指針,因此sizeof(arr1[0])可以取值爲4或8,具體取決於您是在運行32位還是64位應用程序。

如果col = 2,那麼arr1[0]可以保存兩個double值,即arr1[0][0]arr1[0][1],如圖所示。由於要複製整行,因此必須指定arr1[0]所保存的字節長度,可通過@ToddChristensen或sizeof(arr1[i][0])*col指示的sizeof(double)*col來實現。

由於您收到的警告要求指定明確的長度,因此您必須使用低於memcpy的值才能使複製操作正常工作。

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

希望得到這個幫助!

8

sizeof(arr1[i])產生一個double*指針變量的大小,而不是您分配的數組的實際大小。

該警告是完美的,非常感謝。

2

改爲嘗試sizeof(double) * colsizeof()不知道您傳遞給new的參數。