我知道用C定义长度可变的数组是不可能的,但是仅仅声明它呢?
#include <stdio.h>
int main ()
{
int num = 5;
int array[num];
printf("%d\n",sizeof(array));
return 0;
}
上面的代码进行编译和打印20
。它是不确定的行为吗?
如果我写
int array[num] = {0};
我会的error: variable-sized object may not be initialized
。
#include <stdio.h>
void change(int *in){
*in = 6;
}
int main ()
{
int num = 5;
change(&num);
int array[num];
printf("%d\n",sizeof(array));
return 0;
}
gcc test.c
。
以上打印24
正确。编译器在编译期间如何知道正确的大小?
该代码是干净的C99代码。C99添加了对VLA(可变长度数组)的支持。C11使支持成为可选。您的代码可以干净地编译,只是printf()
应当使用%zu
而不是%d
从中打印值sizeof()
。
C11 §6.5.3.4的sizeof
和_Alignof
运营商说:
¶2
sizeof
运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。大小由操作数的类型确定。结果是一个整数。如果操作数的类型是可变长度数组类型,则对操作数求值;否则,不对操作数求值,结果为整数常量。
在您的代码中,大小是在运行时评估的。您可能具有以下代码:
printf("Enter the array size: ");
if (scanf("%d", &n) != 1 || n <= 0 || n > 1024)
{
fprintf(stderr, "Did not get a valid size\n");
exit(EXIT_FAILURE);
}
int array[n];
然后打印尺寸仍然是正确的-在运行时计算(评估)了尺寸。但这仅适用于VLA。
VLA可能未初始化-标准也很明确-§6.7.9初始化说:
¶3要初始化的实体的类型应为未知大小的数组或不是可变长度数组类型的完整对象类型。
您不能为VLA编写初始化程序。那是一个“约束”;编译器必须抱怨该标准的滥用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句