c-在没有memcpy的情况下连接2个数组



假设我有

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

并随后分配值。

设-1,2,3,4,5
b-6、7、8、9、10

有没有一种方法可以在不使用进一步的mallocreallocmemcpy的情况下连接这两个mallocated数组?不会有10个位置的malloc!

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

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

您只为a分配了5个int,所以不,如果没有某种形式或内存分配(malloc/realloc),就无法执行此操作,因为a[8]从一开始就是非法的

在执行之后,我必须能够得到[8]=9,而不需要移动阵列

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

如果你不需要严格的数组索引,你可以制作一个伪链表(我知道这个数据类型有一个名字,但我现在记不起来了):

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对象并正确设置它们,这是我留给您的任务。

你的要求是做不到的。

也许你还有其他选择
只需为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 %dn", a[8]);

最新更新