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

时间:2012-07-19 14:07:32

标签: c arrays macros

#define L 1
#define M L+1

int main(void){

    int N=L*M*2;
    char s [N]={'1','2'};
    printf("%d", sizeof(s));

    return 1;   
}

为什么上面的代码无法编译? Eclipse的编译器说了两件事:

  1. 可能无法初始化可变大小的对象:是因为在宏中使用M和L定义N还是因为我无法使用类型初始化数组 arr [x]其中x在任何情况下都是可变的?
  2. 数组初始值设定项中的多余元素 - 这是什么意思?

3 个答案:

答案 0 :(得分:1)

  

因为我无法初始化类型为arr [x]的数组,其中x是变量?

实际上,在C99之前,数组大小必须是常量表达式。在C99中,使用可变长度数组放宽了这一点。

(这与宏无关。)

  

数组初始值设定项中的多余元素 - 这是什么意思?

解决第一个问题,这应该会消失。

答案 1 :(得分:1)

示例中的数组大小由N指定,它不是常量。这意味着您的数组是VLA(可变长度数组)。 C语言不允许在VLA声明中使用初始化器。

为了编译它,N必须让我成为常量(因为ML是常量,N也可以是常量)。使用N或枚举成员声明#define

答案 2 :(得分:0)

如果我没记错的话,

char s [N]={'1','2'};

N需要是常数