14-2. 动态内存管理

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

现在有一个需求:先输入一个整数n,再输入以空格分隔的n个整数,然后求出这n个整数中最大的数。

例如:

输入:

10
8 6 4 1 2 5 7 9 3 0

输出:

9

为了装这n个数,我们可以定义一个稍微大一点的数组,例如int arr[20]

int n;
int arr[20];

待用户输入n后,循环n次,读取用户输入的n个数。

//  输入n的值
scanf("%d", &n);
//  循环n次,输入n个数据
for (int i = 0; i < n; i++)
{
    scanf("%d", &arr[i]);
}

声明一个变量max,暂时认为第一个元素为最大的,把max赋值为arr[0]。接着,让max与数组中的前n个元素依次比较,把较大的放入max中。这样,就找到了输入的n个数据中最大的数。

//  暂时认为第一个元素为最大的
int max = arr[0];
//  max与各个元素比较,把较大的放入max
for (int i = 0; i < n; i++)
{
    if (arr[i] > max)
        max = arr[i];
}
printf("%d\n", max);

这里的特殊性在于,数据的数量n不确定,由用户输入决定。对于不同的输入,会出现以下3种情况。

  1. 如果n小于20,那么仅使用数组arr中的n个元素,后续的20 - n个元素闲置。
  2. 如果n等于20,数组arr中所有元素均被使用到。
  3. 如果n大于20,数组arr无法容纳多于20个元素的数据。

第一种情况会造成有空的元素闲置,而第三种情况数组无法容纳所有需要输入的数据。那么,能否待用户输入n后,再确定数组的元素个数呢?

1. 变长数组

一般而言,在声明数组时,我们会将数组的元素个数确定下来。

在数组元素个数的方括号中填写常量或常量表达式,确定数组元素个数。下面两个数组的元素数量均为10。

int arr1[10];
int arr2[5 + 5];

或者省略方括号中数组元素的数量,但是必须要有初始化列表,并按照初始化列表中元素的数量,确定数组元素的数量。下面的数组声明中,虽然方括号中没有填元素数量,但是初始化中有10个元素。因此,数组也将有10个元素。

int arr3[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

另外,还有一种比较特别的声明数组的方法。在数组元素个数的方括号中填一个变量,这样可以创建一个变长数组。

int n;
scanf("%d", &n);
int arr[n];
printf("sizeof of arr %d\n",sizeof(arr));

当输入10时,数组arr的大小为10 * sizeof(int),即40字节。

sizeof = 40

当输入20时,数组arr的大小为20 * sizeof(int),即80字节。

sizeof = 80

根据运行后的现象,数组的大小确实根据输入来确定的。但是,请注意,变长数组已经从C语言标准中移除了。编译器不一定会支持变长数组的特性。也就是说,这段代码可能在你的编译器中无法通过编译。