方法1:动态内存分配(最常用)
使用 malloc、calloc 或 realloc 在运行时分配内存,模拟动态长度的数组。

(图片来源网络,侵删)
示例代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n; // 用户输入的数组长度
int *arr; // 指向动态数组的指针
printf("请输入数组长度: ");
scanf("%d", &n);
// 动态分配内存
arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("内存分配失败!\n");
return 1;
}
// 输入数组元素
for (int i = 0; i < n; i++) {
printf("请输入第 %d 个元素: ", i + 1);
scanf("%d", &arr[i]);
}
// 输出数组
printf("数组内容: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 释放内存
free(arr);
return 0;
}
关键点:
malloc分配未初始化的内存,calloc分配并初始化为0。- 必须检查
malloc是否返回NULL(分配失败)。 - 使用
free释放内存,避免内存泄漏。
方法2:变长数组(VLA,C99标准支持)
C99 引入了变长数组(VLA),允许在运行时指定数组大小,但作用域仅限于当前函数。
示例代码:
#include <stdio.h>
void printArray(int n) {
int arr[n]; // 变长数组(VLA)
for (int i = 0; i < n; i++) {
arr[i] = i * 2;
}
printf("VLA数组内容: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int n;
printf("请输入数组长度: ");
scanf("%d", &n);
printArray(n);
return 0;
}
关键点:
- VLA 的大小必须在运行时确定,且必须是常量表达式(如变量)。
- VLA 在栈上分配内存,长度过大可能导致栈溢出。
- 注意:C11 标准中 VLA 是可选的,部分编译器(如 MSVC)不支持。
方法3:固定大小的超大数组(不推荐)
如果预估最大长度,可以定义一个足够大的静态数组,但会浪费内存。
示例代码:
#include <stdio.h>
#define MAX_SIZE 1000
int main() {
int arr[MAX_SIZE];
int n;
printf("请输入数组长度(不超过 %d): ", MAX_SIZE);
scanf("%d", &n);
if (n > MAX_SIZE) {
printf("错误:长度超过限制!\n");
return 1;
}
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
printf("数组内容: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
缺点:
- 浪费内存(即使实际数据很少)。
- 需要提前预估最大长度,不够灵活。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 动态内存分配 | 灵活,可随时调整大小 | 需手动管理内存,可能泄漏 | 通用,推荐使用 |
| 变长数组(VLA) | 无需手动管理内存,语法简洁 | 可能栈溢出,C11后非强制支持 | 小规模数据,C99环境 |
| 固定大小数组 | 简单,无内存泄漏风险 | 浪费内存,长度受限 | 已知最大长度且数据量较小的情况 |
推荐使用动态内存分配,因为它最灵活且兼容性最好。

(图片来源网络,侵删)
