C中没有标准的可调整大小的数组类型。您必须自己实现它,或使用第三方库。这是一个简单的简单示例:
typedef struct int_array
{
int *array;
size_t length;
size_t capacity;
} int_array;
void int_array_init(int_array *array)
{
array->array = NULL;
array->length = 0;
array->capacity = 0;
}
void int_array_free(int_array *array)
{
free(array->array);
array->array = NULL;
array->length = 0;
array->capacity = 0;
}
void int_array_push_back(int_array *array, int value)
{
if(array->length == array->capacity)
{
// Not enough space, reallocate. Also, watch out for overflow.
int new_capacity = array->capacity * 2;
if(new_capacity > array->capacity && new_capacity < SIZE_T_MAX / sizeof(int))
{
int *new_array = realloc(array->array, new_capacity * sizeof(int));
if(new_array != NULL)
{
array->array = new_array;
array->capacity = new_capacity;
}
else
; // Handle out-of-memory
}
else
; // Handle overflow error
}
// Now that we have space, add the value to the array
array->array[array->length] = value;
array->length++;
}像这样用它:
int_array a;
int_array_init(&a);
int i;
for(i = 0; i < 10; i++)
int_array_push_back(&a, i);
for(i = 0; i < a.length; i++)
printf("a[%d] = %d\n", i, a.array[i]);
int_array_free(&a);当然,这仅适用于int数组。由于C没有模板,因此您必须将所有这些代码放在宏中,以用于每种不同类型的数组(或使用不同的预处理器,如GNU m4)。或者,您可以使用通用数组容器,该容器使用void*指针(要求所有数组元素为malloc'ed)或不透明内存blob,这需要对每个元素访问进行强制转换,并为每个元素获取/设置memcpy。
无论如何,它并不漂亮。二维阵列甚至更加丑陋。