C语言动态分配数组案例详解
什么是动态分配数组
在C语言中,数组是一种非常基础的数据类型,它可以容纳一组相同类型的数据,而且数组的长度是静态的,也就是在声明时就要确定数组的长度。比如:
int arr[10]; //声明了一个长度为10的整型数组
但是,在很多情况下,我们并不知道数组要存储多少个元素,或者存储元素数量会发生变化。此时,就需要采用动态分配数组的方式。
动态分配数组就是在程序运行时动态地分配一段内存空间,用于存储数组元素。动态分配数组的长度是在程序运行时根据实际需要进行分配的。
动态分配数组的声明和使用
动态分配数组的声明和使用需要掌握两个库函数:malloc和free。其中,malloc函数用来动态分配内存空间,它的调用方式如下:
void *malloc(size_t size);
其中,size_t类型是一个无符号整型,表示要分配的内存大小,单位是字节。这个函数返回一个void类型的指针,指向分配到的内存空间的起始位置。如果分配失败,返回值为NULL。
使用malloc分配数组时,需要注意,它只分配了一段连续的内存空间,并不会初始化数组元素的值。因此,需要使用循环语句将数组元素逐个初始化。
使用完毕后,需要使用free函数将分配的内存空间释放,以免造成内存泄漏。
下面,就来看两个动态分配数组的示例。
示例一:动态分配一维数组
#include <stdio.h>
#include <stdlib.h> //malloc函数所在的头文件
int main()
{
int *arr; //声明一个指向整型的指针
int len; //用于存放要分配的数组长度
int i; //循环计数器
printf("请输入要分配的数组长度:");
scanf("%d", &len);
arr = (int*)malloc(len * sizeof(int)); //动态分配数组的内存空间
if(arr == NULL) //分配失败
{
printf("动态分配内存空间失败!\n");
return -1;
}
//逐个初始化数组元素
for(i = 0; i < len; i++)
{
printf("请输入第%d个元素的值:", i + 1);
scanf("%d", &arr[i]);
}
//打印数组元素
printf("您输入的数组元素为:");
for(i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
free(arr); //释放动态分配的内存空间
return 0;
}
这段代码演示了如何动态分配一个一维数组,并且逐个初始化数组元素。请注意,在使用malloc分配数组内存时,需要先将void类型的指针强制类型转换为对应的数组类型指针,故而在arr的声明语句中要进行强制转换:
arr = (int*)malloc(len * sizeof(int));
示例二:动态分配二维数组
#include <stdio.h>
#include <stdlib.h> //malloc函数所在的头文件
int main()
{
int **arr; //声明一个指向二维整型数组的指针
int row, col; //用于存放行数和列数
int i, j; //循环计数器
printf("请输入要分配的数组的行数和列数,中间用空格隔开:");
scanf("%d %d", &row, &col);
//动态分配二维数组的内存空间
arr = (int**)malloc(row * sizeof(int*)); //分配一维的指针数组
for(i = 0; i < row; i++) //逐个分配一维数组的内存空间
{
arr[i] = (int*)malloc(col * sizeof(int));
}
//逐个初始化数组元素
for(i = 0; i < row; i++)
{
for(j = 0; j < col; j++)
{
printf("请输入第%d行第%d列的元素值:", i + 1, j + 1);
scanf("%d", &arr[i][j]);
}
}
//打印数组元素
printf("您输入的二维数组元素为:\n");
for(i = 0; i < row; i++)
{
for(j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
//释放动态分配的内存空间
for(i = 0; i < row; i++)
{
free(arr[i]);
}
free(arr);
return 0;
}
这段代码演示了如何动态分配一个二维数组。和一维数组不同的是,二维数组实际上可以看成是由若干个一维数组组成的。因此,在动态分配二维数组时,需要先分配一维指针数组的内存空间,再逐个分配每个一维数组的内存空间,并将每个一维数组的指针存入二维指针数组中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 动态分配数组案例详解 - Python技术站