我正在用C语言写一个程序,我想要读取一个数组长度,并创建一个这个大小的数组。但是,C语言不支持可变长度的数组,所以我想知道如何做到这一点。我不想更改我的编译器设置。
我正在考虑以某种方式使用对我有利的预处理器指令,但我还没能做到。很大程度上,我有一个包含我想要的大小的整数变量,我想用0来声明这个数组,另外,我不想使用malloc/其他动态数组方法。
这可能看起来很基本,但我已经努力了一段时间。如果这很重要,我将通过I/O接收数组大小。
发布于 2019-06-10 23:59:34
有几种可能的解决方案,但没有一种能满足您的所有需求。
调用malloc
是显而易见的解决方案;这就是它的用途。你已经说过你不想使用malloc
,但是你还没有解释为什么。
C确实支持可变长度数组--或多或少。VLA在C90中不存在,在C99中引入,并在C11中成为可选。因此,如果你想要可移植的代码,你不能假设它们是受支持的。如果是这样的话,你可以这样做:
int size;
// get value of size from input
int vla[size];
有一些限制。如果没有足够的内存(堆栈大小可能比堆大小更受限制),则行为是未定义的。另一方面,对于普通的固定大小的数组也是如此,VLA可以让您分配更少的内存,而不是假设一个固定的上限。VLA仅存在于块作用域,因此当控制离开封闭的块时(通常是函数返回时),对象将不复存在。
您可以定义一个数组(可能在文件范围内,在任何函数定义之外),您知道该数组足够大,可以容纳您的数据。您必须指定一些上限。例如,您可以定义int arr[10000];
,然后拒绝任何大于10,000的输入。然后,您可以将该数组的初始子集用于您的数据。
你说你想创建一个“可变大小的数组”,但是你“不想使用malloc/其他动态数组方法”。听起来您想创建一个动态数组,但您并不想创建一个动态数组。这就好比你说你想拧螺丝,但你不想用螺丝刀。
发布于 2019-06-10 22:47:20
但是,C不支持可变长度的数组,
不对。这是完全有效的C代码:
#include <stdio.h>
int main(void)
{
int size;
scanf("%d", &size);
int arr[size];
}
它被称为VLA (可变长度数组),自1999年以来一直是C语言的一部分。然而,这在C11中是可选的,但是像clang和gcc这样的大型编译器永远不会删除它们。至少在可预见的未来不会。
发布于 2019-06-10 23:30:11
我可以问一下:为什么您对malloc()过敏?
我这么问的原因是,许多人试图为C定义一个安全的配置文件,他们认为malloc是所有邪恶的根源。在这种情况下:
int *arr;
arr = mmap(0, sizeof *arr * N, PROT_READ|PROT_WRITE, MAP_PRIVATE, -1, 0);
https://stackoverflow.com/questions/56533887
复制