为什么C数组初始化语法不允许任意赋值?

时间:2013-09-25 18:48:14

标签: c arrays

我试图在Java中学习数组基础知识并且出现了这个问题:

版本1:

int[] x  = {12,34,56,78};

第2版:

int[] x;  
x = {12,34,56,78};

版本1是正确的,但版本2不正确。

为什么会这样?它背后的故事是什么? 请从面向编译器的角度描述这一点。

5 个答案:

答案 0 :(得分:3)

编译器需要知道在声明数组时为数组分配多少存储空间。

int x[] = {12,34,56,78};

在这种情况下,编译器知道它需要存储四个整数;这与说int x[4]相似。

int x[];
/* ... */
x = {12,34,56,78};

但是,在这种情况下,编译器会看到int x[],并知道它必须为数组分配空间,但它不知道多少,直到它到达以下行,时间已经太晚了。

答案 1 :(得分:2)

在后一种情况下,编译器需要处理的第一行只是int x[];。编译器不知道制作数组需要多长时间,除非你给它一个长度int x[4];或给它初始值,允许它确定长度。

答案 2 :(得分:2)

这就是为什么

这是使用数组初始化语法的变量声明和初始化:

int[] x = {12,34,56,78}; // this is java. my bad
int x[] = {12,34,56,78}; // this is c

这是变量声明:

int[] x; // java again
int x[]; // this is c

只有在声明变量时才允许初始化变量(包括使用数组初始化语法)。

这是带有语法错误的变量赋值:

x = {12,34,56,78}; 

答案 3 :(得分:1)

这里的分配实际上是初始化。此类语法只能用作声明的一部分,但不能用于独立表达式。

此语法的两个部分(在=符号的左侧和右侧)一起工作:编译器从初始化程序中的项目数中导出数组int x[]的大小;它不能在以后添加到x的类型中,即在进行赋值时,因为必须在声明点知道C数组的大小。

答案 4 :(得分:1)

简单......版本2不知道如何为数组值分配空间