【问题标题】:C: Copy array without knowing its typeC:复制数组而不知道它的类型
【发布时间】:2011-04-16 16:41:06
【问题描述】:

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

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

以及 main 中的代码:

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

我的另一种选择是不复制,只是将一个数组指向另一个数组的元素,这可能吗?

谢谢。

【问题讨论】:

    标签: c arrays void-pointers


    【解决方案1】:

    memcpy 是您要查找的函数。

    【讨论】:

    • 刚刚尝试用memcpy((char*)newArr+newPos,(char*)arr+cPos,elemSize); 替换代码没有运气
    • 您忘记将 newPos 和 cPos 乘以 elemSize。
    • 非常感谢,它有效,你知道我是否可以只复制地址而不复制值吗?
    • @Alex:是的:您可以对指针数组进行排序,但它会以多种方式改变语义。我担心如果你不得不问,你可能不会立即摆脱所有后果。花点时间考虑一下数据的生命周期:何时存在,何时消失,谁拥有指针的副本,以及如何知道这些指针是否仍然有效。你是一名程序员,所以你可以弄清楚这一切,但要小心。
    • 我不明白你的意思。
    【解决方案2】:

    这行不通

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

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

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 1970-01-01
      • 2017-11-24
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多