如何将通用void数组拆分为parts.c

时间:2015-01-24 21:39:01

标签: c arrays void memcpy memmove

作为C语言的初学者,我正在努力解决一个模糊的问题,因为我找不到解决这个问题的方法,我想问你以下几点: 目前我正在尝试理解void指针及其算术运算。我试图写一个泛型函数,它接受一个指向数组的void指针,数组的长度和一个元素的大小,并将给定的数组拆分成两个不同的部分(list1和list2): / p>

void split(void *array, int arrlen, int objsize)
{
// divide the arrlen and save the values
    int len_list1 = arrlen / 2;
    int len_list2 = arrlen - len_list1;

// Allocate memory for two temporary lists
    void *list1 = (void*)malloc(objsize * len_list1);
    void *list2 = (void*)malloc(objsize * len_list2);

    if (list1 == NULL || list2 == NULL)
    {
        printf("[ERROR]!\n");
        exit(-1);
    }

// list1 gets initialized properly with int and char elements
    memmove(list1, array, len_list1*objsize);           
    printf("list1:"); 
    print_arr(list1, len_list1);

// memmove((char*)list2, (char*)array+list_1_length, list_2_length*objsize); (*)
    memmove(list2, (int*)array+len_list1, len_list2*objsize);
    printf("list2:");
    print_arr(list2, len_list2);
}

我的问题如下: 如果我给这个函数一个int数组它会工作正常,但如果我用一个char数组作为参数调用split(),我必须...

memmove((char*)list2, (char*)array+list_1_length, list_2_length*objsize);
//memmove((int*)list2, (char*)array+list_1_length, list_2_length*objsize);

注释行(*)out,以获得相同的结果。一个解决方案当然可能是写一个if-else条件并测试objsize:

if (objsize == sizeof(int))
    // move memory as in the 1st code snippet
else
    // move memory with the (int*) cast

但是使用这个解决方案我还需要检查其他数据类型,所以你很乐意给我一个提示。

谢谢!

-matzui

2 个答案:

答案 0 :(得分:3)

memmove(list2, (int*)array+len_list1, len_list2*objsize);

在这里,您将array强制转换为int *,并向其添加len_list1。但是向指针添加内容意味着它将与该指针的数据类型的一个元素的大小相乘。因此,如果int是4个字节,并且您向int *变量添加5,则它将移动20个字节。

因为您确切地知道要移动指针的字节数,所以可以转换为char *(char = 1字节),并为其添加字节数。

因此,您可以使用(int*)array+len_list1

代替(char*)array+(len_list1*objsize)

答案 1 :(得分:1)

void指针只是一个字大小的可解除引用的指针,它不包含特定的数据类型。因此,你不能用它做指针数学。要执行您要执行的操作,请在函数中声明一个适当类型的指针,然后将其值设置为等于参数void指针的值。