在最近的一篇文章中,我看到了:
scanf("%d" , &TASK_NO);
struct task_info tasks[TASK_NO];
printf("total: %d\n", sizeof(tasks)/sizeof(tasks[0]));
带有注释的:“sizeof()
在编译时进行评估,而不是运行时,因此不会给出正确的总数。”
在C语言的所有历史中,sizeof
在编译时被评估,并且可以被赋予一个声明的数组(声明的数组类似int a[10];
而sizeof(a)
给出10次int的大小。使用C99,可以提供在运行时自动变量的数组大小。这是否意味着必须在运行时评估声明的自动数组sizeof
的{{1}}?即,有tasks[TASK_NO]
成为有时在运行时评估的东西吗?如果没有,是否将sizeof
用于VLA定义为错误(因此编译器会发出警告/错误消息,因为您要求已知在编译时无法判断时间)?