问题描述
#include<stdio.h>
int main(void){
const int size=5;
int grades[size]={34,23,67,89,68};
double sum=0.0;
double *ptr_to_sum=∑
int i;
printf("\n my grades are:\n");
for(i=0;i<size;i++){
printf("%d\t",grades[i]);}
printf("\n\n");
for(i=0;i<size;i++){
sum+=grades[i];
}
printf("my average grade is %.2f\n\n",sum/size);
printf("\n\n");
printf("sum is at %p,or %luandis%lf\n",ptr_to_sum,*ptr_to_sum);
printf("grades are at %lu to %lu\n",grades,grades+5);
}
即使是一个简单的代码,我也无法弄清楚错误,代码是正确的,但我只是不知道为什么会出现这个错误。 请任何人都可以帮助我吗? 经过深思熟虑后,我可以假装这是由于用于求和的数据类型 long 而发生的。
ERROR:pointers.c: In function 'main':
pointers.c:7:5: error: variable-sized object may not be initialized
7 | int grades[size]={34,68};
| ^~~
pointers.c:7:23: warning: excess elements in array initializer
7 | int grades[size]={34,68};
| ^~
pointers.c:7:23: note: (near initialization for 'grades')
pointers.c:7:26: warning: excess elements in array initializer
7 | int grades[size]={34,68};
| ^~
pointers.c:7:26: note: (near initialization for 'grades')
pointers.c:7:29: warning: excess elements in array initializer
7 | int grades[size]={34,68};
| ^~
pointers.c:7:29: note: (near initialization for 'grades')
pointers.c:7:32: warning: excess elements in array initializer
7 | int grades[size]={34,68};
| ^~
pointers.c:7:32: note: (near initialization for 'grades')
pointers.c:7:35: warning: excess elements in array initializer
7 | int grades[size]={34,68};
| ^~
pointers.c:7:35: note: (near initialization for 'grades')
解决方法
在 C 中,如果您使用变量作为数组的维度,即使是 const
变量,也会使数组大小可变(在 C++ 中,const
变量不是这种情况).
因为数组是可变大小的(从编译器的角度来看),它不能初始化数组 - 因为它假设它不知道有多少元素,所以它不能生成正确的初始化代码。
恐怕你将不得不在这里求助于宏——如果你想给数组一个大小。或者,您可以省略大小,并允许编译器为您推断大小 - 但这需要您初始化数组的所有元素,如果您给数组一个尺寸。
,抱怨是你有一个由变量给出的大小(所以它不是常数)和一个初始化列表。这里:
const int size=5;
int grades[size]={34,23,67,89,68};
试试这个:
int grades[] = {34,68};
如果您确实需要将大小作为变量/常量,则以下任一方法都可以:
#define NUM_GRADES 5
int grades[] = {34,68};
...
for(i=0;i<NUM_GRADES;i++){
-- 或 --
int grades[] = {34,68};
int size = sizeof grades / sizeof grades[0];
,
来自 C 标准(6.7.6.2 数组声明符):
- ... 如果大小是整数常量表达式,元素类型 具有已知的常量大小,数组类型不是 变长数组类型;否则,数组类型是一个变量 长度数组类型。
和(6.6 常量表达式)
6 整数常量表达式应具有整数类型并且应 只有整数常量、枚举常量的操作数, 字符常量,结果为整数的 sizeof 表达式 常量和作为直接操作数的浮点常量 铸件。整数常量表达式中的强制转换运算符只能 将算术类型转换为整数类型,除非作为 操作数到 sizeof 运算符。
在这些声明中
const int size=5;
int grades[size]={34,68};
变量 size
不是整数常量表达式。因此数组 grades
是一个可变长度数组。并根据 C 标准(6.7.9 初始化)
3 要初始化的实体的类型应该是一个数组 未知大小或完整的对象类型不是可变长度 数组类型。
所以当数组 grades
被声明为可变长度数组时,您可以对其进行初始化。
您可以使用整数常量表达式代替常量变量 size
,例如枚举常量:
enum { size = 5 };
int grades[size]={34,68};
请注意这一点,因为您在此语句中已经有了整数常量 size
then 而不是幻数 5
printf("grades are at %lu to %lu\n",grades,grades+5);
最好写
printf( "grades are at %p to %p\n",( void * )grades,( void * )( grades + size ) );
要输出指针,您必须使用转换说明符 %p
。
另一种方法是声明数组 grades
而不指定元素数量。例如
int grades[] = { 34,68 };
然后声明一个变量来存储数组中元素的数量,如
const size_t size = sizeof( grades ) / sizeof( *grades );