在C语言编程中,数组长度通常需要预先定义,但实际开发中经常需要让用户输入数组的长度,再创建对应大小的数组来存储数据。C语言本身不提供直接通过输入定义数组长度的语法,需要结合输入函数和对应的数组创建方式来实现。

一、C99标准下的变长数组方式
C99标准引入了变长数组(VLA)的特性,允许使用变量来定义数组的长度,前提是这个变量在定义数组之前已经被赋值。这种方式适合数组长度不大、不需要长期占用内存的场景。
实现步骤
首先通过scanf函数获取用户输入的数组长度,将其存储到一个整型变量中,再使用该变量定义数组即可。
代码示例
#include <stdio.h>
int main() {
int n;
// 提示用户输入数组长度
printf("请输入数组的长度:");
// 读取用户输入的整数作为数组长度
scanf("%d", &n);
// 使用输入的n作为数组长度定义变长数组
int arr[n];
// 验证数组创建成功,给数组元素赋值并打印
printf("请输入%d个整数:n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
printf("你输入的数组元素为:n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("n");
return 0;
}
需要注意的是,变长数组的长度在定义后不能修改,且部分较老的编译器可能不支持C99的变长数组特性,使用时需要确认编译器的标准支持情况。
二、动态内存分配方式
如果需要兼容不支持C99的编译器,或者数组长度较大、需要手动控制内存释放,可以使用动态内存分配的方式。通过malloc函数在堆上申请对应大小的内存空间,来实现输入数组长度后创建数组的需求。
实现步骤
先通过scanf获取用户输入的数组长度,计算需要申请的内存大小,调用malloc申请内存,使用完成后通过free释放内存,避免内存泄漏。
代码示例
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
// 提示用户输入数组长度
printf("请输入数组的长度:");
scanf("%d", &n);
// 动态申请n个int类型大小的内存空间
int *arr = (int *)malloc(n * sizeof(int));
// 检查内存申请是否成功
if (arr == NULL) {
printf("内存申请失败n");
return 1;
}
// 给数组元素赋值
printf("请输入%d个整数:n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 打印数组元素
printf("你输入的数组元素为:n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("n");
// 释放动态申请的内存
free(arr);
arr = NULL;
return 0;
}
两种方式的选择建议
- 如果使用的编译器支持C99及以上标准,且数组长度较小、不需要长期保留数组数据,优先选择变长数组方式,代码更简洁。
- 如果需要兼容老版本编译器,或者数组长度较大、需要在函数之间传递数组,优先选择动态内存分配方式,灵活性更高。
无论使用哪种方式,输入数组长度时都需要做基本的合法性校验,比如判断输入的长度是否为正数,避免出现数组长度为0或负数的异常情况。