c - 具有恒定大小的数组(全局与堆栈)

标签 c gcc

当我尝试这段代码时,它起作用了:

const int i = 5;
int main() {
    int arry[i];
}

即使这不起作用:

const int i = 5;
int arry[i];
int main() {

}

我在这里阅读了所有关于大小不变的数组的帖子,但我不明白为什么在 main 中声明 arry 时它会起作用。

最佳答案

这里的问题是 C 中的 const 不会产生真正的常量。

当您编写 const int i = 5 时,您拥有的是一个只读变量,而不是常量。在 C99 中,以 i 为维度的数组是可变长度数组 (VLA)。 VLA 仅适用于堆栈分配的变量,因此您会看到编译错误。

如果您需要一个具有全局范围的数组,您应该切换到宏。

#define ARRAY_SIZE 5
int arry[ARRAY_SIZE];

这是有效的,因为 5 是一个真正常量的文字。

事实上,即使是自动存储数组(即堆栈分配的局部变量),您也应该避免使用 VLA,因为它们会产生运行时开销。

关于c - 具有恒定大小的数组(全局与堆栈),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7946415/

相关文章:

c - 哪里学C最好?

用gcc编译C文件得到x86汇编代码

c++ - QObject 实例池

c++ - 无法构建 boost

c - 将 FreeRTOS 与 XC8 编译器结合使用

c++ - 使用 xchg 时需要 mfence 吗

c - 如何为头文件中定义(声明?)的数组分配内存?

c++ - `Multiple definitions` 错误指向 pthread.h

在 clang 中编译而不是 gcc?

c++ - CMakeLists.txt 中的编译器标志不会出现在 CMake-Gui 或 CMakeCache.txt 中