Конкатенация 2 массивов без memcpy - PullRequest
1 голос
/ 07 февраля 2012

Предположим, я ве

int *a,*b;  
a= malloc(5*sizeof(int));  
b= malloc(5*sizeof(int)); 

и впоследствии присваиваю значения.

Пусть a - 1, 2, 3, 4, 5
b - 6, 7, 8, 9, 10

Есть ли способ объединить оба этих неправильных массива без дальнейшего использования malloc, realloc или memcpy?Не должно быть malloc из 10 локаций!

Я должен быть в состоянии получить a[8]=9 после выполнения, без накладных расходов на перемещение массивов. Язык: C

Ответы [ 3 ]

6 голосов
/ 07 февраля 2012
a= malloc(5*sizeof(int));

Вы только выделили 5 дюймов на a, поэтому нет, вы не можете сделать это без какой-либо формы или выделения памяти (malloc / realloc), так как a[8] было бы недопустимо для начала.

Я должен иметь возможность получить [8] = 9 после выполнения, без накладных расходов на перемещение массивов

Поскольку вы работаете со смежными областями памяти (которые вы называете массивами) у вас всегда будут некоторые накладные расходы при перемещении элементов вокруг .Если вам не нужен доступ к элементам по их индексам, просто используйте связанные списки.

4 голосов
/ 07 февраля 2012

Если вам не нужна строгая индексация массива, вы можете создать псевдосвязанный список (я знаю, что есть имя для этого типа данных, но я не могу его запомнить сейчас):

struct listish {
  int *arr
  size_t size;
  struct listish *next;
};

Функция «индексирования» будет выглядеть так:

int *index(struct listish *list, size_t i)
{
    if(list == NULL) return NULL; // index out of bounds
    if(i < list->size) return list->arr + i; // return a pointer to the element
    else return index(list->next, i - list->size); // not in this array - go to next node
}

Идея состоит в том, чтобы объединить переупорядочение на месте связанного списка с непрерывным пространством массива. В этом случае index(list, 4) вернет &a[4], а index(list, 5) вернет &b[0], имитируя непрерывное индексирование без перераспределения и перемещения всего массива - все, что вам нужно сделать, - это выделить несколько небольших struct listish объектов и установить их правильно, задача, которую я оставляю вам.

2 голосов
/ 07 февраля 2012

То, что вы просите, не может быть сделано.

Возможно, у вас есть другой вариант.
Просто выделите место для 10 значений и сделайте b указанием на правильный элемент

int *a = malloc(10 * sizeof *a);
/* error checking missing */
int *b = a + 5;

a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4; a[4] = 5;
b[0] = 6; b[1] = 7; b[2] = 8; b[3] = 9; b[4] = 10;

printf("a[8] is %d\n", a[8]);
...