创建不带malloc的可变大小数组

时间:2019-06-10 21:42:01

标签: c

我正在用C编写程序,我想读取一个数组长度,并创建该大小的数组。但是,C不支持变长数组,因此我想知道如何做到这一点。我不想更改我的编译器设置。

我正在考虑以某种方式利用预处理器指令来发挥自己的优势,但我一直未能做到这一点。差不多,我有一个包含所需大小的整数变量,我想用0声明数组。另外,我不想使用malloc /其他动态数组方法。

这似乎很基本,但是一段时间以来我一直在努力做到这一点。如果有关系,我将通过I / O接收阵列大小。

5 个答案:

答案 0 :(得分:2)

有几种可能的解决方案,都不能满足您的所有需求。

调用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 /其他动态数组方法”。听起来您想创建一个动态数组,但是您不想创建一个动态数组。这就像在说要拧螺丝,但不想使用螺丝刀。

答案 1 :(得分:0)

  

但是,C不支持可变长度数组,

错了。这是完全有效的C代码:

#include <stdio.h>

int main(void)
{
    int size;
    scanf("%d", &size);
    int arr[size];
}

它称为VLA(可变长度数组),自1999年以来一直是C的一部分。

答案 2 :(得分:0)

请问:您为什么对malloc()过敏?

我问的原因是许多为C定义安全配置文件的尝试都提出malloc是万恶之源。在这种情况下:

int *arr;
arr = mmap(0, sizeof *arr * N, PROT_READ|PROT_WRITE, MAP_PRIVATE, -1, 0);

答案 3 :(得分:0)

您可以做的是读取数组长度,然后生成程序的源代码:

fprintf(outfile, "int main(void) { static int arr[%d]; ...}\n", size);

然后在生成的程序上执行编译器(例如,使用system函数),并运行生成的可执行文件。

答案 4 :(得分:0)

任何支持可变长度数组的语言都使用下面的动态内存分配机制来实现该功能。 “ C”没有支持真正的可变长度数组的语法糖,但它提供了模仿一个糖的所有机制。

mallocreallocfree等可轻松用于处理任何大小和类型的元素数组的动态分配和释放。您可以在内存中分配数据,并使用指针将引用返回给调用方函数或传递给其他函数。 (另一方面,“ C”个VLA用途有限,如果在堆栈上分配,则不能返回给调用方)。

因此,最好的选择(除非您从事嵌入式软件开发)是开始使用'c'动态内存分配。