当前位置: 首页 > news >正文

c语言动态数组扩容

一维数组扩容:

#include <stdlib.h>// 1维数组扩容。array_ptr为一维数组的指针
void expand_int_array(int** array_ptr, int old_size, int new_size) {int* new_array = (int*)malloc(new_size * sizeof(int));if (!new_array) {fprintf(stderr, "内存分配失败\n");return;}memset(new_array, 0, new_size * sizeof(int));if (*array_ptr) {memcpy(new_array, *array_ptr, old_size * sizeof(int));free(*array_ptr);}*array_ptr = new_array; // 修改调用者的指针
}

测试代码:

void testExpandArray() {// 测试一维数组扩容int* arr = (int*)malloc(4 * sizeof(int));if (!arr) return;arr[0] = 9;arr[1] = 5;arr[2] = 2;arr[3] = 7;expand_int_array(&arr, 4, 8);printArr1(arr, 8);
}

运行结果:

ok. 

二维数组扩容:

// 扩容二维数组arr_ptr为二维数组的指针
void expand_2d_array(int*** arr_ptr, int* current_capacity, int new_capacity, int* column_sizes) {if (new_capacity <= *current_capacity) {printf("新容量必须大于当前容量\n");return;}int** new_arr = (int**)malloc(new_capacity * sizeof(int*));if (!new_arr) {perror("内存分配失败");return;}// 复制原有行数据for (int i = 0; i < *current_capacity; i++) {new_arr[i] = (*arr_ptr)[i];}// 初始化新增行(每行列数由column_sizes指定)for (int i = *current_capacity; i < new_capacity; i++) {new_arr[i] = (int*)malloc(column_sizes[i] * sizeof(int));if (!new_arr[i]) {perror("行内存分配失败");return;}memset(new_arr[i], 0, column_sizes[i] * sizeof(int));}free(*arr_ptr); // 原有的释放掉*arr_ptr = new_arr;*current_capacity = new_capacity;
}

测试代码:

void testExpandArray2() {// 测试二维数组扩容int capacity = 3;int** arr = (int**)malloc(capacity * sizeof(int*));if (!arr) return;int column_sizes[] = { 2, 3, 1 }; // 初始每行的列数// 初始化原始数组for (int i = 0; i < capacity; i++) {arr[i] = (int*)malloc(column_sizes[i] * sizeof(int));if (!arr[i]) return;for (int j = 0; j < column_sizes[i]; j++) {arr[i][j] = j;}}// 准备扩容参数int new_capacity = 5;int new_column_sizes[] = { 2, 3, 1, 4, 2 }; // 包含原有行和新增行的列数. expand_2d_array(&arr, &capacity, new_capacity, new_column_sizes);printArr2(arr, new_capacity, new_column_sizes);
}void printArr2(int** arr, int size, int* returnColumnSizes) { // 打印二维数组printf("[");int isFirst = 1;for (int i = 0; i < size; i++) {if (isFirst) {isFirst = false;}else {printf(",");}int isSubFirst = 1;printf("[");for (int j = 0; j < returnColumnSizes[i]; j++) {if (isSubFirst) {isSubFirst = false;}else {printf(",");}printf("%d", arr[i][j]);}printf("]");}printf("]\n");
}void printArr1(int* arr, int size) // 打印一维数组
{printf("[");int isFirst = 1;for (int i = 0; i < size; i++) {if (isFirst) {isFirst = false;}else {printf(",");}printf("%d", arr[i]);}printf("]\n");
}

运行结果:

ok.  另外,也可以利用realloc函数实现动态数组扩容。代码略。

http://www.xdnf.cn/news/1382185.html

相关文章:

  • MCU平台化实践方案
  • STL库——list(类函数学习)
  • 财务数据报销画像技术实现:从数据采集到智能决策的全流程解析
  • 【AI自动化】VSCode+Playwright+codegen+nodejs自动化脚本生成
  • 当new一块内存时,操作系统做了哪些事情
  • 软考 系统架构设计师系列知识点之杂项集萃(134)
  • leetcode算法刷题的第二十天
  • 鸿蒙OS与Rust整合开发流程
  • 面试tips--JVM(3)--类加载过程
  • 动态加载和异步调用tasklet/workqueue day63 ay64
  • 中国剩余定理(以及扩展..)
  • .Net Core Web 架构(管道机制)的底层实现
  • [光学原理与应用-321]:皮秒深紫外激光器产品不同阶段使用的工具软件、对应的输出文件
  • 【黑客技术零基础入门】2025最新黑客工具软件大全,零基础入门到精通,收藏这篇就够了!
  • JAVA全栈Redis篇————List常用命令讲解
  • 【架构师干货】软件工程
  • Linux学习-TCP并发服务器构建(epoll)
  • Cesium 入门教程(十一):Camera相机功能展示
  • Burp系列【密码暴力破解+令牌token破解】
  • 深度学习篇---VGGNet网络结构
  • DeepInteraction++基于多模态交互的自动驾驶感知与规划框架
  • 【iOS】Masnory自动布局的简单学习
  • Linux(二) | 文件基本属性与链接扩展
  • Spring Security 深度学习(二): 自定义认证机制与用户管理
  • npm install --global @dcloudio/uni-cli 时安装失败
  • 一天认识一个神经网络之--CNN卷积神经网络
  • QT之双缓冲 (QMutex/QWaitCondition)——读写分离
  • LINUX ---网络编程(三)
  • 如何通过docker进行本地部署?
  • 机器学习回顾(二)——KNN算法