关于自己在编写动态数组的一些问题

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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值