引子
在C语言中,定义一个“大小未知”的数组直接是不可行的,因为数组在声明时必须有确定的大小,要么是在编译时确定的常量表达式,要么是在C99或更高标准下,允许运行时确定大小的变长数组(VLA)。
变长数组(Variable Length Array,简称VLA)是C99标准引入的一个特性,允许在函数的局部作用域中定义数组,其大小可以在运行时确定。变长数组的大小必须是一个非负整数表达式,并且在数组的生命周期内不能改变。
但是,如果你想要处理大小未知或动态变化的数据集,可以使用动态内存分配来模拟“大小未知”的数组。这通常通过使用malloc、calloc、realloc和free函数来实现。
函数 | 用途 |
---|---|
malloc | 内存分配 |
calloc | 分配并清零 |
realloc | 重新分配 |
举例应用
下面是一个使用malloc和realloc来创建和扩展数组的示例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *array;
int size = 0; // 初始大小为0
int capacity = 5; // 起始分配容量
int newElement;
// 动态分配内存
array = (int *)malloc(capacity * sizeof(int));
if (array == NULL)
{
fprintf(stderr, "Memory allocation failed!\n");
return 1;
}
// 扩展和使用数组
while (1)
{
printf("请输入一个整数(输入-1结束):");
scanf("%d", &newElement);
if (newElement == -1) break;
// 检查是否需要增加数组容量
if (size == capacity)
{
capacity *= 2; // 增加一倍容量
array = (int *)realloc(array, capacity * sizeof(int));
if (array == NULL)
{
fprintf(stderr, "Memory reallocation failed!\n");
return 1;
}
}
array[size++] = newElement; // 添加新元素
}
// 打印数组
printf("数组中的元素:\n");
for (int i = 0; i < size; i++)
{
printf("%d ", array[i]);
}
printf("\n");
// 释放内存
free(array);
return 0;
}
在这个例子中,我们使用了malloc来初始化数组的内存,并使用realloc来动态扩展数组的大小。当数组满时,realloc会尝试分配更多的内存,并将现有数据复制到新的内存空间。当程序结束时,使用free来释放分配的内存。
结语
这种方法虽然可以实现“大小未知”的数组,但需要手动管理内存的分配和释放,以避免内存泄漏和程序异常。此外,使用realloc可能会导致数据重新拷贝,可能影响性能。