struct dynamicArray
{
void** pAddr;
//数组的容量(注:数组的容量和数组的大小是有区别的,数组的容量指的是数组最大能存多少数据而数组的大小指的是数组此时存了多少数据)
int m_Capacity;
//数组大小
int m_Size;
};
struct dynamicArray* init_dynamicArray(int capacity)
{
if (capacity <= 0)
{
return NULL;
}
//给数组分配内存
struct dynamicArray* arr = malloc(sizeof(struct dynamicArray));
if (arr == NULL)
{
return NULL;
}
//给属性初始化
arr->pAddr = malloc(sizeof(void*) * capacity);
//容量初始化
arr->m_Capacity = capacity;
//大小初始化
arr->m_Size = 0;
return arr;
}
在数组的初始化中我们可以看到用了两个malloc函数,其中第一个malloc函数是因为我们需要一个 struct dynamicArray*类型的变量而这个变量只负责存一个地址这个地址就指向我们的动态数组这个结构体,而动态数组的内容并不在这个地址指向的内存单元里而是在arr->pAddr所指向的内存单元中。因此当动态数组容量不够时只用扩展arr->pAddr,如下图所示
if (arr->m_Size == arr->m_Capacity)
{
//申请更大的内存空间
int newCapacity = arr->m_Capacity * 2;
//开辟新空间
void** newSpace = malloc(sizeof(void*) * newCapacity);
//将原始数据拷贝到新空间下
memcpy(newSpace, arr->pAddr, sizeof(void*) * arr->m_Capacity);
//释放原始空间
free(arr->pAddr);
//更改指针指向
arr->pAddr = newSpace;
//更新新容量
arr->m_Capacity = newCapacity;
}