C:复制数组而不知道其类型

时间:2011-04-16 16:41:07

标签: c arrays void-pointers

我有函数,它接收指向数组的指针和指向函数的指针,并且应该返回新的数组,其顺序由参数传递的函数定义。 我的问题是如何在不知道其类型的情况下将一个数组的元素复制到另一个数组

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后包含垃圾, 有人能指出我,我想念的是什么吗?

我的另一个选择是不复制,只是将一个数组指向其他元素,是否可能?

感谢。

2 个答案:

答案 0 :(得分:6)

memcpy是您正在寻找的功能。

答案 1 :(得分:0)

这不起作用

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

因为你取消引用arr + cPos因为它是char,所以它只复制第一个字节。