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,避免野指针
- 美的空调面盖打开图解(空调拆机步骤) 2024-09-20
- 佛说阿弥陀经讲解(《阿弥陀经》的宗旨) 2024-09-20
- 怎样选好用的鲫鱼竿,文中定有你中意的一款 2024-09-20
- 什么狗不爱叫(5种话少又吃得少的狗) 2024-09-20
- 马尾松树油有什么功能 2024-09-20
- 火龙果树怎么种植(火龙果高产种植技术) 2024-09-20
- 青铜是什么意思(“青铜”称谓的来由) 2024-09-20
- 金针菇明天见是什么意思(金针菇吃了不消化等于白吃?) 2024-09-20
网站内容来自网络,如有侵权请联系我们,立即删除!
Copyright © 内百科 鲁ICP备2023048205号-2