假设我有
int *a,*b;
a= malloc(5*sizeof(int));
b= malloc(5*sizeof(int));
并随后分配值。
设-1,2,3,4,5
b-6、7、8、9、10
有没有一种方法可以在不使用进一步的malloc
、realloc
或memcpy
的情况下连接这两个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]);