2011-04-16 51 views
0

我有函數,它接收指向數組的指針和指向函數的指針,並且應該返回新的數組,其順序由參數中傳遞的函數定義。 我的問題我如何複製一個陣列到另一個元素,而不知道它的類型C:複製數組而不知道它的類型

void * scrambleArr(void * arr, int numElem, int elemSize, int (*func)(void*)) { 
    void * newArr; 
    int cPos, newPos,i; 

    newArr = (void *)malloc(numElem*elemSize); 

    for (i=0 ; i < numElem ; i++) 
    { 
     cPos = i*elemSize; 
     newPos = func((char*)arr+cPos); 
     *((char*)newArr+newPos) = *((char*)arr+cPos); 
    } 
    return newArr; 
} 

功能,在最後一個參數

int posArrayBySize(void *el) { 
    ARRAY* arr = (ARRAY *)el; 
    return arr->size - 1; 
} 

和代碼傳遞主:

int main() { 
    ARRAY * arrSorted; 
    int a[2] = {1,2}; 
    int b[3] = {1,1,1}; 
    int c[1] = {9}; 
    int d[4] = {3,3,3,3}; 
    ARRAY arr[4] = {{a,2},{b,3},{c,1},{d,4}}; 

    arrSorted =(ARRAY *)scrambleArr(arr,4,sizeof(ARRAY),posArrayBySize); 

    free(arrSorted); 
    return 0; 
} 

後運行arrSorted包含垃圾, 有人可以指點我,我想念什麼?

另一種選擇對我來說不是複製,只是爲了指向一個數組元素,可能嗎?

謝謝。

回答

6

memcpy是你正在尋找的功能。

+0

試圖用'memcpy((char *)newArr + newPos,(char *)arr + cPos,elemSize)替換代碼;'沒有運氣 – Alex 2011-04-16 16:49:56

+0

忘記了用elemSize乘以newPos和cPos。 – AProgrammer 2011-04-16 16:55:19

+0

非常感謝,它的工作原理,你知道我是否可以複製只有地址,沒有值? – Alex 2011-04-16 16:59:49

0

這將無法正常工作

*((char*)newArr+newPos) = *((char*)arr+cPos); 

,因爲你提領ARR + CPOS,因爲它是字符,所以將只複製的第一個字節。

相關問題