как новичок в C, я борюсь с неясной проблемой, и, поскольку я не мог найти решение этой конкретной проблемы, я хочу спросить вас о следующем: в настоящее время я пытаюсь понять указатели void и их арифметические операции. Я попытался написать общую функцию, которая принимает пустой указатель на массив, длину массива и размер одного элемента и разбивает данный массив на две разные части (список1 и список2):
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, listmemmove((char*)list2, (char*)array+list_1_length, list_2_length*objsize);
//memmove((int*)list2, (char*)array+list_1_length, list_2_length*objsize);
length*objsize); (*)
memmove(list2, (int*)array+len_list1, len_list2*objsize);
printf("list2:");
print_arr(list2, len_list2);
}
Моя проблема заключается в следующем: если я передам этой функции массив int, она будет работать нормально, но если я вызову функцию 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
Но с этим решением мне также пришлось бы проверять другие типы данных, поэтому было бы очень любезно с вашей стороны дать мне подсказку.
Спасибо!
-мацуи
free
дляlist1
иlist2
после того, как закончите с ними. Кроме того,memmove
может пригодиться, но поскольку вы копируете данные в блоки памяти, которые только что были выделены, у вас есть гарантия, чтоarray
,list1
иlist2
не будут перекрываться, поэтому вы должны использовать здесьmemcpy
(изstring.h
). Пожалуйста, рассмотрите мое редактирование вашего поста. - person dummydev   schedule 29.05.2015