二维结构体初始化出错

时间:2021-12-22 22:17:00
static struct
 { char ch;
 double x;
 char a[]; 
}c[2][2]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}};
//error C2233: '<Unknown>' : arrays of objects containing zero-size arrays are illegal
//error C2078: too many initializers
我不知道这样对二维结构体初始化为什么会出这样的错。

28 个解决方案

#1


字符串是双引号

#2


对不起,题打错了,是二维结构体数组初始化出错,改成双引号一样的是这样的错误,所以我没去改

#3


引用 2 楼 ljia0 的回复:
对不起,题打错了,是二维结构体数组初始化出错,改成双引号一样的是这样的错误,所以我没去改

结构体的赋值,还是老老实实使用obj.member = XXX的方式,C语言没这么智能

#4


//error C2233: '<Unknown>' : arrays of objects containing zero-size arrays are illegal
这个错误可能是因为结构体里面的数组a[]初始体出错,但是//error C2078: too many initializers
这个我就搞不明白了,怎么可能会多呢,明明是还不够。

#5


char a[]; 这句能编译过吗?数组要有大小的
char a[N]; 
或char *a; 

#6


引用 5 楼 selooloo 的回复:
char a[]; 这句能编译过吗?数组要有大小的
char a[N]; 
或char *a;

改成char *a;后第一个错误就会没有,但是数组初始化不是给定了所有的元素就可以不用标出大小。

#7


引用 3 楼 jackyjkchen 的回复:
引用 2 楼 ljia0 的回复:
对不起,题打错了,是二维结构体数组初始化出错,改成双引号一样的是这样的错误,所以我没去改

结构体的赋值,还是老老实实使用obj.member = XXX的方式,C语言没这么智能

但是我总得弄明白为什么这样会出错吧。

#8


引用 6 楼 ljia0 的回复:
引用 5 楼 selooloo 的回复:
char a[]; 这句能编译过吗?数组要有大小的
char a[N];
或char *a;

改成char *a;后第一个错误就会没有,但是数组初始化不是给定了所有的元素就可以不用标出大小。

你这是结构体啊,结构体定义时,大小要确定的,连定义都通不过,怎么赋值啊

#9


static struct
 { char ch;
 double x;
 char a[10]; 
} c[1][3]={{{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"}}};
但改成这样就不会出错了。

#10


我觉得c[2][2]={{{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"}}};
应该是这样存储的:
c[0][0]:'a'
         3.5
         "bc"
c[0][1]:'c'
         4.5
         "de"
c[1][0]:'m'
         8.6
         "abc"
c[1][1]:....

#11


static struct
 { char ch;
 double x;
 char a[10]; 
}c[2][2]={{{'a',3.5,"bc"},{'c',4.5,"de"}},{'m',8.6,"abc"}}; 
这样也不会出错,多少列一定要标出!!!

#12


数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

#13


引用 8 楼 selooloo 的回复:
引用 6 楼 ljia0 的回复:
引用 5 楼 selooloo 的回复:
char a[]; 这句能编译过吗?数组要有大小的
char a[N];
或char *a;

改成char *a;后第一个错误就会没有,但是数组初始化不是给定了所有的元素就可以不用标出大小。

你这是结构体啊,结构体定义时,大小要确定的,连定义都通不过,怎么赋值啊

同意你的说法,谢谢!

#14


引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 也不会出错

#15


static struct
 { char ch;
 double x;
 char a[10]; 
}c[2][2]={{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"},{'s',5.9,"iii"}};还是出错
//error C2078: too many initializers

但是下面这个不会出错,为什么?
static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};


static struct
 { char ch;
 double x;
 char a[10]; 
}c[2][2]={{{'a',3.5,"bc"},{'c',4.5,"de"}},{{'m',8.6,"abc"},{'s',5.9,"iii"}}};
又不出错,一定要把第二维的个数标明吗,那为什么上一例的不用标明也不会出错?

#16


引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 也不会出错

用1 * 3 的初始化 2 * 3 的自然可以,

#17


引用 16 楼 mymtom 的回复:
引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'……

但是以下还是出同样错:static struct
 { char ch;
 double x;
 char a[10]; 
}c[1][3]={{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"}};//error C2078: too many initializers

#18



#include<stdio.h>
static struct
 { char ch;
 double x;
 char a[10];                //这样看的清晰。
}c[2][2]={
            {
  {'a',3.5,"bc"},{'s',3.1,"sd"}
            },
{
  {'c',4.5,"de"},{'e',9.4,"we"}
        }
         };



static struct
 { char ch;
 double x;               
 char a[10];  
}c[2][2]={               //你的这个相当于在地一维的两个元素中,初始化三个元素,
           {
     {'a',3.5,"bc"},{'c',4.5,"de"}//,{'a',3,"d"}
           },
           { }
         };

#19


static struct
 { char ch;
 double x;
 char a[10];  
}c[2][2]={{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"},{'s',5.9,"iii"}};还是出错
//error C2078: too many initializers

但是下面这个不会出错,为什么?
static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

#20


引用 17 楼 ljia0 的回复:
引用 16 楼 mymtom 的回复:
引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]={{{'a',3.5,'bc'},{'c……


你是用什么编译器,我用gcc,只报警告,不报错。
程序如下:
int main()
{
struct { char ch;
 double x;
 char a[10];
}c[1][3]={
        {'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"}
};
}

编译结果如下:
2DimensionArray.c: In function ‘main’:
2DimensionArray.c:6: warning: excess elements in array initializer
2DimensionArray.c:6: warning: (near initialization for ‘c’)
2DimensionArray.c:6: warning: excess elements in array initializer
2DimensionArray.c:6: warning: (near initialization for ‘c’)

#21


引用 20 楼 aichongqu 的回复:
引用 17 楼 ljia0 的回复:

引用 16 楼 mymtom 的回复:
引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]……

你的是三个大括号当然不报,去掉最外层的那对大括号就会出错了

#22


引用 20 楼 aichongqu 的回复:
引用 17 楼 ljia0 的回复:

引用 16 楼 mymtom 的回复:
引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]……

看错了,我用的是VC++

#23


warning: excess elements in array initializer
你的这个报警在我这里就报错了

#24


static struct
   { 
      char   ch;
      double x;
      char   a[10];  
   } c[2][2] = { {{'a', 3.5, "bc"}, {'c', 4.5, "de"}}, {{'m', 8.6, "abc"}, } };
   

或直接
static struct
   { 
      char   ch;
      double x;
      char   a[10];  
   } c[2][2] = { 'a', 3.5, "bc", 'c', 4.5, "de", 'm', 8.6, "abc" };
   

#25


static struct
   { 
      char   ch;
      double x;
      char   a[10];  
   } c[2][2] = { 'a', 3.5, "bc", 'c', 4.5, "de", 'm', 8.6, "abc" };  
为什么上面的可以,而下面这个
c[2][2]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}};
就会出错呢?

#26


没有哪个能说出为什么吗?

#27


引用 25 楼 ljia0 的回复:
static struct
  { 
  char ch;
  double x;
  char a[10];  
  } c[2][2] = { 'a', 3.5, "bc", 'c', 4.5, "de", 'm', 8.6, "abc" };  
为什么上面的可以,而下面这个
c[2][2]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'a……

貌似多了次外层的一重大括号,
c[2][2]={{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}};
试试.

#28


引用 27 楼 huanmie_09 的回复:
貌似多了次外层的一重大括号,
c[2][2]={{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}};
试试.

c[2][2]={{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}};会出错
就是改成:c[1][3]={{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}};也会出错,但:c[2][2]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}};就不会出错
我是越来越搞不明的数组的初始化了,不知道它是怎样给它们的成员赋值的。

#1


字符串是双引号

#2


对不起,题打错了,是二维结构体数组初始化出错,改成双引号一样的是这样的错误,所以我没去改

#3


引用 2 楼 ljia0 的回复:
对不起,题打错了,是二维结构体数组初始化出错,改成双引号一样的是这样的错误,所以我没去改

结构体的赋值,还是老老实实使用obj.member = XXX的方式,C语言没这么智能

#4


//error C2233: '<Unknown>' : arrays of objects containing zero-size arrays are illegal
这个错误可能是因为结构体里面的数组a[]初始体出错,但是//error C2078: too many initializers
这个我就搞不明白了,怎么可能会多呢,明明是还不够。

#5


char a[]; 这句能编译过吗?数组要有大小的
char a[N]; 
或char *a; 

#6


引用 5 楼 selooloo 的回复:
char a[]; 这句能编译过吗?数组要有大小的
char a[N]; 
或char *a;

改成char *a;后第一个错误就会没有,但是数组初始化不是给定了所有的元素就可以不用标出大小。

#7


引用 3 楼 jackyjkchen 的回复:
引用 2 楼 ljia0 的回复:
对不起,题打错了,是二维结构体数组初始化出错,改成双引号一样的是这样的错误,所以我没去改

结构体的赋值,还是老老实实使用obj.member = XXX的方式,C语言没这么智能

但是我总得弄明白为什么这样会出错吧。

#8


引用 6 楼 ljia0 的回复:
引用 5 楼 selooloo 的回复:
char a[]; 这句能编译过吗?数组要有大小的
char a[N];
或char *a;

改成char *a;后第一个错误就会没有,但是数组初始化不是给定了所有的元素就可以不用标出大小。

你这是结构体啊,结构体定义时,大小要确定的,连定义都通不过,怎么赋值啊

#9


static struct
 { char ch;
 double x;
 char a[10]; 
} c[1][3]={{{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"}}};
但改成这样就不会出错了。

#10


我觉得c[2][2]={{{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"}}};
应该是这样存储的:
c[0][0]:'a'
         3.5
         "bc"
c[0][1]:'c'
         4.5
         "de"
c[1][0]:'m'
         8.6
         "abc"
c[1][1]:....

#11


static struct
 { char ch;
 double x;
 char a[10]; 
}c[2][2]={{{'a',3.5,"bc"},{'c',4.5,"de"}},{'m',8.6,"abc"}}; 
这样也不会出错,多少列一定要标出!!!

#12


数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

#13


引用 8 楼 selooloo 的回复:
引用 6 楼 ljia0 的回复:
引用 5 楼 selooloo 的回复:
char a[]; 这句能编译过吗?数组要有大小的
char a[N];
或char *a;

改成char *a;后第一个错误就会没有,但是数组初始化不是给定了所有的元素就可以不用标出大小。

你这是结构体啊,结构体定义时,大小要确定的,连定义都通不过,怎么赋值啊

同意你的说法,谢谢!

#14


引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 也不会出错

#15


static struct
 { char ch;
 double x;
 char a[10]; 
}c[2][2]={{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"},{'s',5.9,"iii"}};还是出错
//error C2078: too many initializers

但是下面这个不会出错,为什么?
static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};


static struct
 { char ch;
 double x;
 char a[10]; 
}c[2][2]={{{'a',3.5,"bc"},{'c',4.5,"de"}},{{'m',8.6,"abc"},{'s',5.9,"iii"}}};
又不出错,一定要把第二维的个数标明吗,那为什么上一例的不用标明也不会出错?

#16


引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 也不会出错

用1 * 3 的初始化 2 * 3 的自然可以,

#17


引用 16 楼 mymtom 的回复:
引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'……

但是以下还是出同样错:static struct
 { char ch;
 double x;
 char a[10]; 
}c[1][3]={{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"}};//error C2078: too many initializers

#18



#include<stdio.h>
static struct
 { char ch;
 double x;
 char a[10];                //这样看的清晰。
}c[2][2]={
            {
  {'a',3.5,"bc"},{'s',3.1,"sd"}
            },
{
  {'c',4.5,"de"},{'e',9.4,"we"}
        }
         };



static struct
 { char ch;
 double x;               
 char a[10];  
}c[2][2]={               //你的这个相当于在地一维的两个元素中,初始化三个元素,
           {
     {'a',3.5,"bc"},{'c',4.5,"de"}//,{'a',3,"d"}
           },
           { }
         };

#19


static struct
 { char ch;
 double x;
 char a[10];  
}c[2][2]={{'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"},{'s',5.9,"iii"}};还是出错
//error C2078: too many initializers

但是下面这个不会出错,为什么?
static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

#20


引用 17 楼 ljia0 的回复:
引用 16 楼 mymtom 的回复:
引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]={{{'a',3.5,'bc'},{'c……


你是用什么编译器,我用gcc,只报警告,不报错。
程序如下:
int main()
{
struct { char ch;
 double x;
 char a[10];
}c[1][3]={
        {'a',3.5,"bc"},{'c',4.5,"de"},{'m',8.6,"abc"}
};
}

编译结果如下:
2DimensionArray.c: In function ‘main’:
2DimensionArray.c:6: warning: excess elements in array initializer
2DimensionArray.c:6: warning: (near initialization for ‘c’)
2DimensionArray.c:6: warning: excess elements in array initializer
2DimensionArray.c:6: warning: (near initialization for ‘c’)

#21


引用 20 楼 aichongqu 的回复:
引用 17 楼 ljia0 的回复:

引用 16 楼 mymtom 的回复:
引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]……

你的是三个大括号当然不报,去掉最外层的那对大括号就会出错了

#22


引用 20 楼 aichongqu 的回复:
引用 17 楼 ljia0 的回复:

引用 16 楼 mymtom 的回复:
引用 14 楼 ljia0 的回复:
引用 12 楼 mymtom 的回复:
数组是2*2的
{{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}}; 是1*3的,
所以报error C2078: too many initializers

c[2][3]……

看错了,我用的是VC++

#23


warning: excess elements in array initializer
你的这个报警在我这里就报错了

#24


static struct
   { 
      char   ch;
      double x;
      char   a[10];  
   } c[2][2] = { {{'a', 3.5, "bc"}, {'c', 4.5, "de"}}, {{'m', 8.6, "abc"}, } };
   

或直接
static struct
   { 
      char   ch;
      double x;
      char   a[10];  
   } c[2][2] = { 'a', 3.5, "bc", 'c', 4.5, "de", 'm', 8.6, "abc" };
   

#25


static struct
   { 
      char   ch;
      double x;
      char   a[10];  
   } c[2][2] = { 'a', 3.5, "bc", 'c', 4.5, "de", 'm', 8.6, "abc" };  
为什么上面的可以,而下面这个
c[2][2]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}};
就会出错呢?

#26


没有哪个能说出为什么吗?

#27


引用 25 楼 ljia0 的回复:
static struct
  { 
  char ch;
  double x;
  char a[10];  
  } c[2][2] = { 'a', 3.5, "bc", 'c', 4.5, "de", 'm', 8.6, "abc" };  
为什么上面的可以,而下面这个
c[2][2]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'a……

貌似多了次外层的一重大括号,
c[2][2]={{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}};
试试.

#28


引用 27 楼 huanmie_09 的回复:
貌似多了次外层的一重大括号,
c[2][2]={{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}};
试试.

c[2][2]={{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}};会出错
就是改成:c[1][3]={{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}};也会出错,但:c[2][2]={{{'a',3.5,'bc'},{'c',4.5,'de'},{'m',8.6,'abc'}}};就不会出错
我是越来越搞不明的数组的初始化了,不知道它是怎样给它们的成员赋值的。