C语言如何定义未知长度的数组?

99ANYc3cd6
预计阅读时长 9 分钟
位置: 首页 C语言 正文

方法1:动态内存分配(最常用)

使用 malloccallocrealloc 在运行时分配内存,模拟动态长度的数组。

c语言 定义未知长度的数组
(图片来源网络,侵删)

示例代码:

#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环境
固定大小数组 简单,无内存泄漏风险 浪费内存,长度受限 已知最大长度且数据量较小的情况

推荐使用动态内存分配,因为它最灵活且兼容性最好。

c语言 定义未知长度的数组
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
dede导航如何调用子栏目?
« 上一篇 前天
织梦个人空间模板如何修改?
下一篇 » 前天

相关文章

取消
微信二维码
支付宝二维码

目录[+]