网站首页 > 技术文章 正文
C语言动态数组是指在声明时没有确定数组大小的数组,即忽略方括号中的下标;当要用它时,可随时用内存管理函数重新指定数组的大小。动态数组的内存空间是从堆(heap)上分配的,是在执行代码过程中分配的,当程序执行到这些语句时,才为其分配。注意,程序员自己负责释放内存。
C语言提供了一些内存管理函数来帮助我们来按需要动态地分配和回收内存空间,这些函数包括:
- `malloc(size)`:在堆上分配一块长度为size字节的连续区域,并返回其首地址。
- `calloc(n, size)`:在堆上分配n块长度为size字节的连续区域,并返回其首地址。与malloc不同的是,calloc会将分配的空间初始化为0。
- `realloc(p, size)`:重新分配堆上的指针p所指的空间,使其长度为size个字节,并返回新的首地址。同时会复制原有内容到新分配的空间。注意,size可大可小(如果新的大小大于原内存大小,则新分配部分不会被初始化;如果新的大小小于原内存大小,可能会导致数据丢失)。
- `free(p)`:释放指针p所指的堆上的空间。
这些函数都需要包含`<stdlib.h>`头文件。使用这些函数时,需要注意以下几点:
- 函数的返回值是`void*`类型,表示一个无类型或类型不确定的指针。我们可以用强制类型转换的方法将其转换为所需的类型,例如`int* p = (int*)malloc(sizeof(int) * n);`。
- 函数的返回值可能是NULL,表示内存分配失败。我们需要在使用指针之前检查是否为NULL,并做相应的异常处理。
- 分配的堆空间是没有名字的,只能通过返回的指针找到它。我们不能对非动态分配的存储块使用free,也不能对同一块内存区同时用free释放两次。
- 调用free时, 传入指针指向的内存被释放, 但调用函数的指针值可能保持不变, 因为p是作为形参而传递给了函数。严格地说, 被释放的指针值是无效的, 因为它已不再指向所申请 的内存区。这时对它的任何使用便可能会带来问题。
使用内存管理函数构建动态数组时,需要遵循以下原则:
- 申请空间时,从外层往里层,逐层申请。
- 释放空间时,从里层往外层,逐层释放。
以二维整型数组`int arr[m][n]`为例,我们可以用以下代码来构建和释放动态数组:
// 构建二维动态数组
int m, n; // 数组大小
int** arr; // 二维指针
scanf("%d%d", &m, &n); // 输入数组大小
arr = (int**)malloc(sizeof(int*) * m); // 申请m个一维指针
if (arr == NULL) { // 检查是否申请成功
printf("内存申请失败!\n");
exit(1);
}
for (int i = 0; i < m; i++) {
arr[i] = (int*)malloc(sizeof(int) * n); // 申请n个整型数据
if (arr[i] == NULL) { // 检查是否申请成功
printf("内存申请失败!\n");
exit(1);
}
}
// 使用动态数组
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &arr[i][j]); // 输入数组元素
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", arr[i][j]); // 输出数组元素
}
printf("\n");
}
// 释放动态数组
for (int i = 0; i < m; i++) {
free(arr[i]); // 释放每一行的空间
}
free(arr); // 释放指针数组的空间
arr = NULL; // 将指针置为NULL,避免野指针
系列文章持续更新,如果觉得有帮助请点赞+关注!
- 上一篇: 一起学《C程序设计》第六课——数组、字符串及实战练习
- 下一篇: 一文解读清楚C语言动态数组
猜你喜欢
- 2025-06-25 C语言入门到精通第027讲-C语言传递数组给函数
- 2025-06-25 「C语言」指针进阶第三站,数组指针
- 2025-06-25 C语言基础知识:指针和数组的区别是什么?
- 2025-06-25 合并两个数组
- 2025-06-25 C语言100题集合023-输入月份号并输出英文月份名
- 2025-06-25 C语言字符数组和字符串
- 2025-06-25 C语言100题集合027-二维数组的经典案例,非常重要
- 2025-06-25 C语言中的一维数组理解
- 2025-06-25 Excel三种方法多条件筛选,你都用过吗?
- 2025-06-25 C语言-数组平均值与排序
- 06-25C语言入门到精通第027讲-C语言传递数组给函数
- 06-25「C语言」指针进阶第三站,数组指针
- 06-25C语言基础知识:指针和数组的区别是什么?
- 06-25合并两个数组
- 06-25C语言100题集合023-输入月份号并输出英文月份名
- 06-25C语言字符数组和字符串
- 06-25C语言100题集合027-二维数组的经典案例,非常重要
- 06-25C语言中的一维数组理解
- 最近发表
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- think in java (14)
- javascript权威指南 (19)
- nfs (25)
- componentart (17)
- yii框架 (14)
- springbatch (28)
- oracle数据库备份 (25)
- iptables (21)
- 自动化单元测试 (18)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- http error 503 (21)
- pop3服务器 (18)
- 图表组件 (17)
- android退出应用 (21)
- 图片透明度 (20)
- c 数组 (33)