Heyo。在我的C程序中,我处理大量的操作,我必须读取文件,并将其数据存储在数组中。为此,由于C中的数组处理有点复杂,我使用以下代码中建议的代码:C dynamically growing array
typedef struct {
float *array;
size_t used;
size_t size;
} points;
void initArrayInd(arrayInd *a, size_t initialSize) {
a->array = (GLubyte *)malloc(initialSize * sizeof(GLubyte));
a->used = 0;
a->size = initialSize;
}
void insertArrayInd(arrayInd *a, GLubyte element) {
if (a->used == a->size) {
a->size *= 2;
a->array = (GLubyte *)realloc(a->array, a->size * sizeof(GLubyte));
}
a->array[a->used++] = element;
}
void freeArrayInd(arrayInd *a) {
free(a->array);
a->array = NULL;
a->used = a->size = 0;
}
我已经习惯了Java编程,所以我的思维方式在大多数情况下都是错误的。我希望,基于这种动态数组分配,能够创建一个新函数,它将在我指定的位置插入一条记录。我想知道最好的方法是什么。
我应该在数组的末尾插入新记录,然后将所有内容移动到一个位置。我应该创建一个新数组,复制i-1元素,然后放置i并复制i + n元素。我应该将初始数组拆分为两个,创建第三个并将所有内容混合在一起。 C中最好的方法是什么?
编辑:这会这样做吗?void insertFPointsAt(points *a, float element, int position) {
if (a->used == a->size) {
a->size *= 2;
a->array = (float *)realloc(a->array, a->size * sizeof(float));
}
memmove(&a->array[position], &a->array[position+1], &a->array[a->used] - &a->array[position]);
a->array[position] = element;
}
答案 0 :(得分:3)
当您插入数组的中间时,您需要实现此算法:
memmove
与插入结尾不同的唯一步骤是第三步,您可以将数组的内容向上移动一个元素。即使两个区域重叠,memmove
函数也能正确处理。
编辑: memmove
电话应如下所示:
memmove(&a->array[position+1], &a->array[position], &a->array[a->used] - &a->array[position]);
一些补充说明:
malloc
强制转换的C ++不同,C不要求您转换malloc
/ calloc
/ realloc
的返回值。答案 1 :(得分:1)
您只需要在要插入的索引之后移动元素。当您调整阵列大小时,您将遇到不必要的复制 - realloc
调用可能会为您复制,并且您最终会复制两次。我会做类似的事情:
insert element E at index I:
if resize is necessary:
- allocate new larger buffer
- copy elements 0 to I-1 from old buffer into new buffer
- insert E at index I of new buffer
- copy elements I to end of old buffer into new buffer, starting at index I+1
- free old buffer
else
- copy elements I to end of buffer 'up by one' index
- insert E at index I of the buffer