当前位置: 首页 > 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.dtcms.com/a/355877.html

相关文章:

  • [数据结构] 复杂度和包装类和泛型
  • 虚函数指针和虚函数表的创建时机和存放位置
  • AI记忆革命:从七秒遗忘到终身学习
  • 线程池的执行原理
  • set_property CLOCK_DEDICATED_ROUTE BACKBONE/FALSE对时钟进行约束
  • 强化学习之GRPO
  • 硬件IIC使用问题汇总
  • 错误模块路径: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
  • IMIX数据全链路解析
  • 探索淀粉深加工的无限可能:2026 济南展览会前瞻
  • KeyHydra 2.008 安装教程 3ds Max 2020-2024 详细步骤图解(附安装包下载)
  • 【JavaScript】递归的问题以及优化方法
  • week5-[一维数组]去重
  • (笔记)Android窗口管理系统分析
  • 向量方法证明正余弦定理的数学理论体系
  • 如何保证数据的安全性和隐私性?
  • Spring Boot + KingbaseES 连接池实战
  • TypeScript:枚举类型
  • Milvus向量数据库是什么?
  • Active Directory Basics
  • UPAM(Unified Prompt Attack Model
  • 应急响应/windows权限维持/Linux权限维持
  • 虚拟机逃逸攻防演练:从攻击模拟到隔离漏洞防御实战
  • 机器学习回顾(二)——KNN算法
  • 【Cadence技巧】立创EDA/Altium/Allegro之间的封装转换
  • layout版图设计学习笔记2_工艺流程
  • 切入高潜市场,抢占行业先机!ES SHOW 2025展位预订火爆,10月28-30日共启增长新蓝海
  • php姓名三才五格api接口调用说明
  • 疯狂星期四文案网第53天运营日记
  • gdbserver远程调试和交叉编译gdb