我可以使用整数变量来定义数组长度吗?

Can I use an integer variable to define an arrays length?

我可以使用变量来定义数组的大小吗?

int test = 12;
int testarr[test];

这行得通吗,我不想在初始化后更改数组的大小。 int test 的值在编译时未知。

can i use an variable to define an arrays size?

这叫做 Variable Length Arrays (VLA)。

阅读 Modern C then the C11 standard n1570 (and see this reference). VLAs are permitted in §6.7.6; also read the documentation of your C compiler (e.g. GCC).

但您不想溢出 call stack,笔记本电脑通常限制为 1 兆字节(并且 OS 特定)。

所以您可能更喜欢 C 动态内存分配,例如malloc(3)(和 free ...)或 calloc。 当心memory leaks.

您可能会对 valgrind. You need to learn to use your debugger (e.g. GDB 等工具感兴趣。

因此,当您在 C 上尝试此操作时,如 [https://onlinegdb.com/rJzE8yzC8][1]

编译成功,还可以更新变量的值int test

但是,测试更新后,由于数组是静态定义的,数组的大小没有改变。

为了保证,我建议您使用 const int 或宏变量来执行此操作。

从 C99 开始,它是允许的,但仅限于自动变量。

这是非法的:

int test = 12;
int testarr[test];   // illegal - static storage variable

int foo(void) 
{
    int test = 12;
    static int testarr[test];   // illegal - static storage variable
}

唯一有效的形式是:

int foo(void) 
{
    int test = 12;
    int testarr[test];   // legal - automatic storage variable
}

Can I use an integer variable to define an arrays length?

是的,这就是所谓的 可变长度数组 并且是自 C99 以来的 C 标准的一部分。请注意,实现不需要支持它。因此,您可能更喜欢动态内存分配。看这里:

malloced array VS. variable-length-array

引用C标准:

"If the size is not present, the array type is an incomplete type. If the size is * instead of being an expression, the array type is a variable length array type of unspecified size, which can only be used in declarations or type names with function prototype scope;146) such arrays are nonetheless complete types. If the size is an integer constant expression and the element type has a known constant size,the array type is not a variable length array type; otherwise, the array type is a variable length array type. (Variable length arrays are a conditional feature that implementations need not support; see 6.10.8.3.)"

"146) Thus, * can be used only in function declarations that are not definitions (see 6.7.6.3)."

Source: C18, 6.7.6.2/4

另请注意:

"Array objects declared with the _Thread_local, static, or extern storage-class specifier cannot have a variable length array (VLA) type."

Source: C18, 6.7.6.2/10


无法使用 VLA:

  • 在文件范围内。
  • 当使用 _Thread_localstaticextern 存储-class 说明符限定时。
  • 如果他们有联系。

这意味着它们只能在函数作用域和存储时使用-class automatic,省略任何显式说明符时默认完成。

如果您有不明白的地方,请随时要求进一步说明。

在不了解很多上下文的情况下,这样做不是更容易吗?

#define TEST 12  //to ensure this value will not change at all
int testarr[TEST];

从技术上讲,您的方法也应该有效,但测试的值稍后可能会更改,具体取决于您编写的代码段