【问题标题】:Generic editable functions in C using void*C 中使用 void* 的通用可编辑函数
【发布时间】:2011-04-13 09:16:29
【问题描述】:

我遇到了一些问题。

我需要写一些像memcpy(void*, const void*)这样的函数,它的签名应该是:

void arrayCopy(void *dest, int dIndex, const void *src, int sIndex, int len)

我注意到,在 memcpy 的许多实现中,我们将 void* 转换为 char*,但我认为这不是我的情况,因为 arrayCopy 函数需要用于多种类型的数组,包括structs.

那么,我该怎么做呢?

编辑: 源代码可能是这样的:

#include <stdio.h>
#include <string.h>

void arrayCopy(void *, int, const void *, int, int, size_t);

int main(void)
{
    int i;
    int dest[10] = {1};
    int src [] = {2, 3, 4, 5, 6};

    arrayCopy(dest, 1, src, 0, 5, sizeof(int));

    for (i=0; i<10; i++) printf("%i\n", dest[i]);

    return 0;
}

void arrayCopy(void *dest, int dIndex, const void *src, int sIndex, int len, size_t size)
{
    char *cdest = (char*) dest;
    const char *csrc = (char*) src;
    int i;

    len *= size;

    if (dest == src)
    {
        printf("Same array\n");
    }else
    {
        cdest += (dIndex * size);
        csrc += (sIndex * size);
        for (i=0; i<len; i++)
            *cdest++ = *csrc++;
    }
}

谢谢。

【问题讨论】:

    标签: c generics memcpy void-pointers


    【解决方案1】:

    "char *" 只是一堆字节,C 中的所有内容最终都是字节 - 您可以将指向任何数据结构的指针转换为 char*(您还需要知道结构在内存中的大小)

    【讨论】:

    • char* 是与 int* 大小相同的 ptr,但 *int_var 占用 4 个字节,而 *char_var 占用 1 个字节(在 4 字节系统上)
    【解决方案2】:

    函数必须有元素大小信息,例如:

    void *arrayCopy(void *dest, size_t di,const void *src, size_t si, size_t num, size_t esize)
    {
      char *cdest = (char*) dest;
      const char *csrc = (char*) src;
      return memcpy( &cdest[esize*di], &csrc[esize*si], esize*num );
    }
    ...
    arrayCopy(dest, 1, src, 0, 5, sizeof*src);
    

    【讨论】:

      【解决方案3】:

      您不能使用void 类型的对象。标准不允许这样做。所以你需要把 void 扔掉,最好使用的类型是unsigned char。标准保证unsigned char 可以访问系统中可表示的任何其他类型的所有位。

      【讨论】:

        猜你喜欢
        • 2012-11-08
        • 2018-07-27
        • 2014-03-20
        • 2020-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        相关资源
        最近更新 更多