假设我已经
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数组而不使用其他malloc
,realloc
或memcpy
?不要错过10个地方的商场!
我必须能够在执行后获得a[8]=9
,而无需移动数组的开销。
语言为C
答案 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]);