使用(int)sqrt(N)导致'数组绑定不是整数常量'

时间:2013-03-27 09:48:13

标签: c

#include <stdio.h>
#include <math.h>

int size = (int) sqrt(4);
int arr[size];

int main() {
  return 0;
}

我得到了:

test.c:5: error: array bound is not an integer constant

有人能帮助我吗?

3 个答案:

答案 0 :(得分:5)

您无法使用可变大小的静态存储(例如“全局”数组)定义数组。如果数组具有自动存储(如果它是函数中的数组),它将作为VLA工作。

正如icepack正确指出的那样,在C99中正式引入了VLA。

答案 1 :(得分:2)

int arr[size];

这定义了一个具有常量大小的数组。但size是通过调用sqrt来计算的,因此根据C程序的执行方式,它不是常量。

编译器需要知道数组有多大才能创建程序的全局内存布局。所以sqrt不能延迟到运行时。并且C没有任何可以在编译时解决的“数学”函数的概念。

唯一的方法是自己执行计算并将结果(2)直接放入源代码中。

答案 2 :(得分:-1)

const int size=(int) sqrt(4);

预先计算的常数会这样做。但是,您不能更改数组大小和常量。