连接2个没有memcpy的数组

时间:2012-02-07 09:00:19

标签: c dynamic-arrays

假设我已经

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

是否有一种方法可以连接这些malloced数组而不使用其他mallocreallocmemcpy ?不要错过10个地方的商场!

我必须能够在执行后获得a[8]=9,而无需移动数组的开销。 语言为C

3 个答案:

答案 0 :(得分:6)

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

你只为a分配了5个整数,所以不,如果没有某种形式或内存分配(malloc / realloc)你就不能这样做,因为 a[8]会是非法的开始。

  

我必须能够在执行后获得[8] = 9,而没有开销   移动阵列

由于您正在使用连续的内存区域(您正在调用数组),因此在移动元素时总是会有一些开销。如果您不需要按索引访问元素,只需使用链接列表。

答案 1 :(得分:4)

如果你不需要严格的数组索引,你可以创建一个伪链表(我知道这个数据类型的名称,但我现在不记得了):

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 :(得分:2)

你要求的是无法做到的。

你可能有另一种选择 只需为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]);