我可以使用整数变量来定义数组长度吗?
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_local
、static
或 extern
存储-class 说明符限定时。
- 如果他们有联系。
这意味着它们只能在函数作用域和存储时使用-class auto
matic,省略任何显式说明符时默认完成。
如果您有不明白的地方,请随时要求进一步说明。
在不了解很多上下文的情况下,这样做不是更容易吗?
#define TEST 12 //to ensure this value will not change at all
int testarr[TEST];
从技术上讲,您的方法也应该有效,但测试的值稍后可能会更改,具体取决于您编写的代码段
我可以使用变量来定义数组的大小吗?
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
, orextern
storage-class specifier cannot have a variable length array (VLA) type."Source: C18, 6.7.6.2/10
无法使用 VLA:
- 在文件范围内。
- 当使用
_Thread_local
、static
或extern
存储-class 说明符限定时。 - 如果他们有联系。
这意味着它们只能在函数作用域和存储时使用-class auto
matic,省略任何显式说明符时默认完成。
如果您有不明白的地方,请随时要求进一步说明。
在不了解很多上下文的情况下,这样做不是更容易吗?
#define TEST 12 //to ensure this value will not change at all
int testarr[TEST];
从技术上讲,您的方法也应该有效,但测试的值稍后可能会更改,具体取决于您编写的代码段