打印
[资源共享]

C语言 动态数组的扩容机制

[复制链接]
858|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
海滨消消|  楼主 | 2024-5-16 13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数组扩容的逻辑
通过数组现有元素个数current_size和数组实际的容量size相比较,如果大,则扩容,如果小,则理论上是可以进行缩小的,但在实际开发中,缩小内存空间并不是很多见,因为频繁的修改数组的内存空间,本身也是对性能的一个考验,为什么呢,见下一条;

通过realloc()为指针指向的数组重新分配内存空间的话,可能会导致内存地址的移动,如果移动了,即内存地址发生了改变,那么为了确保数据不会丢失,realloc()会自动将之前数组中的元素是通过复制的形式复制到新指针指向的内存地址中的,如果数据量比较大,那么复制的过程本身就会产生一定的性能开销,因此说如果频繁地修改数组的内存空间本身就是对性能的一大考验;

可是对动态数组进行扩容在实际开发中还是需要的,避免内存溢出,因为在C语言中,一些数据结构中存储的数据规模可能是动态的;

动态扩容实例代码
#include <stdio.h>
#include <stdlib.h>


int main() {
   
    // 当前元素个数
    size_t current_size = 0;
    // 当前数组容量
    size_t size = 10;
    int *array = (int*)calloc(size, sizeof(int));

    if (array == NULL) {
        printf("动态内存分配未成功。\n");
    }else{
        printf("动态分配内存成功!\n");
        // 通过for循环为动态数组复制
        // 假设实际上有20个元素
        size_t realsize = 20;
        for(int i=0; i<realsize; i++){
            if(current_size == size){
                // 重新分配内存,并翻倍
                printf("尝试将内存重新分配为原来的两倍。\n");
                size = size*2;
                int *temp = (int*)realloc(array, size*sizeof(int));
                if(temp == NULL){
                    printf("重新分配内存空间未成功。\n");
                    break;
                }else{
                    printf("重新分配内存空间成功。\n");
                    array = temp;//更新可能被移动的指针
                }
            }
            array[i] = i;
            current_size++;

        }
        // 输出数组元素
        for(int j=0; j<current_size; j++){
            printf("%d",array[j]);
        }
        printf("\n");
        // 输出current_size和size
        printf("current_size=%u;size=%u\n",current_size,size);
        free(array);
    }

    return 0;
}
代码运行,得到输出:

动态分配内存成功!
尝试将内存重新分配为原来的两倍。
重新分配内存空间成功。
012345678910111213141516171819
current_size=20;size=20
免责声明:内容仅供参考,不保证正确性。

使用特权

评论回复
沙发
huquanz711| | 2024-5-20 09:16 | 只看该作者
这种做法风险有点高

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

216

主题

1526

帖子

2

粉丝