gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:27:48 24 4
gpt4 key购买 nike

作为 C 的初学者,我正在为一个晦涩难懂的问题而苦苦挣扎,因为我找不到解决这个特定问题的方法,所以我想问您以下问题:目前我正在尝试了解 void 指针及其算术运算。我试图编写一个通用函数,它接受一个指向数组的空指针、数组的长度和一个元素的大小,并将给定的数组分成两个不同的部分(list1 和 list2):

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

注释行(*)出来,才能有相同的结果。一个解决方案肯定是编写一个 if-else 条件并测试 objsize:

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

但是使用这个解决方案我还必须检查其他数据类型,所以非常感谢你给我一个提示。

谢谢!

-麻嘴

最佳答案

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

在这里你输入arrayint * , 并添加 len_list1给它。但是向指针添加一些东西,意味着它将乘以该指针数据类型的一个元素的大小。因此,如果一个 int 是 4 个字节,并且您将 5 添加到 int *变量,它将移动 20 个字节。

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

所以不是 (int*)array+len_list1 , 你可以使用 (char*)array+(len_list1*objsize)

关于c - 如何将通用 void 数组拆分为 parts.c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28130524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com