为什么这个C程序不能编译?这有什么问题?

时间:2010-07-02 16:08:42

标签: c

为什么这个C程序不能编译?这有什么问题?

我在wxDevC++和Turbo C ++ 3.0上试过了。

MAIN.C

#include<stdio.h>
#include<conio.h>

const int SIZE = 5;

int main(int argc, char ** argv)
{    
    char array[SIZE] = {'A', 'B', 'C', 'D', 'E'};

    printf("Array elements are,\n");
    int i=0;

    for(i=0 ; i<SIZE ; ++i)
    {
        printf("%c  ", array[i]);
    }

    getch();

    return 0;
}

错误两个编译器上的消息类似。

f:\_Source-Codes\main.c In function `main':

8 f:\_Source-Codes\main.c variable-sized object may not be initialized

4 个答案:

答案 0 :(得分:15)

C89 / 90语言中的数组大小必须由整数常量表达式指定(对于C99,通常也是如此)。 C中的const int对象不是常量表达式,这就是您无法使用它来指定数组大小的原因。注意:这是C和C ++之间的一个显着区别。

在C语言中,术语常量指的是文字常量,即510.20xFF,{{1等等(枚举常量也是常量,准确地说)。 'a'对象再次在C中不是常量,不能用于构建常量表达式。

如果要预先声明要在C中用作数组大小的命名常量,则必须使用const int#define。这同样适用于案例标签,位字段大小以及需要恒定表达的每个其他上下文。

有关详细信息,请参阅this

答案 1 :(得分:8)

如果编译器将其视为“.c”文件,则int i声明需要在printf之前的任何可执行行之前。

编辑,现在您显示了错误消息:

编译main时,编译器不会将SIZE视为常量。您可以使用#define SIZE 5作为解决方法。

根据K&amp; R 2nd Ed。 :

  

const的目的是宣布可能以只读方式放置的对象   记忆。 ......除了它应该诊断   显式尝试更改 const   对象,编译器可能会忽略[   const]限定词“。

因此声明const int SIZE = 5不会使SIZE成为常量表达式,这是数组大小说明符所需要的。

答案 2 :(得分:5)

尝试替换

const int SIZE = 5;

#define SIZE 5

大多数C编译器不允许声明其大小包含在变量中的静态数组(即数组大小在运行时确定)。

答案 3 :(得分:3)

试试这个:

char array[] = {'A', 'B', 'C', 'D', 'E'};