为什么我不能创建一个大小由全局变量确定的数组?

时间:2010-03-11 17:48:38

标签: c arrays global-variables

为什么数组a没有被全局变量size初始化?

#include<stdio.h>

int size = 5;

int main()
{
    int a[size] = {1, 2, 3, 4, 5};
    printf("%d", a[0]);

    return 0;
}

编译错误显示为

  

可能无法初始化可变大小的对象

据我所知,数组应该由size初始化。

如果我坚持使用全局变量(如果可能的话),那会是什么答案?

7 个答案:

答案 0 :(得分:22)

在C99,6.7.8 / 3:

  

要实体的类型   initialized应该是一个数组   未知大小或对象类型   不是可变长度数组类型。

6.6 / 2:

  

可以评估常量表达式   在翻译而不是运行时

6.6 / 6:

  

整数常量表达式   应具有整数类型且仅应   具有整数的操作数   常量,枚举常数,   字符常量,sizeof   结果为整数的表达式   常量和浮动常量   是演员的直接操作。

6.7.5.2/4:

  

如果大小是整数常量   表达式和元素类型有一个   已知的常量大小,数组类型是   不是可变长度数组类型;   否则,数组类型是a   可变长度数组类型。

a具有可变长度数组类型,因为size不是整数常量表达式。因此,它不能有初始化列表。

在C90中,没有VLA,因此代码是非法的。

在C ++中也没有VLA,但您可以sizeconst int。那是因为在C ++中你可以在ICE中使用const int个变量。在C中你不能。

据推测,您并不打算a具有可变长度,因此您需要的是:

#define size 5

如果你确实打算a有可变长度,我想你可以这样做:

int a[size];
int initlen = size;
if (initlen > 5) initlen = 5;
memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int));

或者也许:

int a[size];
for (int i = 0; i < size && i < 5; ++i) {
    a[i] = i+1;
}

但很难说,在大小!= 5的情况下,“应该”发生什么。为可变长度数组指定固定大小的初始值没有意义。

答案 1 :(得分:9)

如果要提供初始化程序,则无需告诉编译器数组的大小。编译器将根据您使用它初始化的元素数来计算大小。

int a[] = {1,2,3,4,5};

然后,您甚至可以让编译器通过获取数组的总大小(以字节为单位sizeof(a))并将其除以一个元素sizeof(a[0])的大小来告诉您大小:

int size = sizeof(a) / sizeof(a[0]);

答案 2 :(得分:5)

编译器不能假设main()获得控制时size的值仍为5。如果要在旧式C项目中使用true常量,请使用:

#define size 5

答案 3 :(得分:3)

看起来您的编译器不符合C99 ...说到哪个,您使用的是哪个编译器?如果它是gcc你需要传递开关'-std = c99'....如果你使用的是前C99编译器,那么该语句是非法的,如果是这样的话,那就这样做:

int main() { 
   int a[5]={1,2,3,4,5}; 
   printf("%d",a[0]); 
   return 0; 
}

在C99之前的标准编译器中,使用常量而不是变量。

修改:您可以找到有关C99标准here ...和here的更多信息....

答案 4 :(得分:3)

size是一个变量,C不允许你声明(编辑: C99允许你声明它们,只是不像你那样初始化它们)可变大小的数组像那样。如果要创建大小为变量的数组,请使用malloc或使大小保持不变。

答案 5 :(得分:2)

编译器在声明数组时需要知道数组的大小。 因为数组的大小在声明之后不会改变。 如果将数组的大小放在变量中,可以想象在执行程序时该变量的值会发生变化。 在这种情况下,编译器将被强制为此数组分配额外的内存。 在这种情况下,这是不可能的,因为数组是在堆栈上分配的静态数据结构。 我希望这会有所帮助。

答案 6 :(得分:0)

#include<stdio.h> 

/* int size=5; */
#define size 5 /* use this instead*/
/*OR*/
int a[size]={1,2,3,4,5};  /* this*/

int main() 
{ 
    int a[size]={1,2,3,4,5}; 
    printf("%d",a[0]); 
    return 0; 
} 

int size表示size变量,C不允许变量 size数组。

我正在使用VS2008,其中使用

const int size=5;  

允许

int a[size]={1,2,3,4,5};