【发布时间】:2015-04-07 21:34:34
【问题描述】:
据我了解,每个 VLA 都有其大小的隐藏变量,sizeof 运算符可以“获取”该值。我在这里没有得到的是指向函数参数中使用的 VLA 的指针——为什么它们的大小不自动推断并存储在这个隐藏变量中——为什么我们应该明确地提供它。在这种情况下,既然我们已经有了“指向未知大小数组的指针”类型,为什么还要使用它呢?
我的意思是:
void func(size_t, int (*)[*]); //function accepting pointer to VLA
void func_1(size_t, int (*)[]); //function accepting pointer to array of unknown bound
void func(size_t sz, int (*parr)[sz]) //implementation of 'func'
{
printf("%lu", sizeof(*parr) / sizeof(int));
printf("%lu", sz);
}
void func_1(size_t sz, int(*parr)[]) //implementation of 'func_1'
{
//printf("%lu", sizeof(*parr) / sizeof(int)); //error: invalid application of 'sizeof' to an incomplete type 'int []'
printf("%lu", sz);
}
正如我所见,使用“func”而不是“func_1”的唯一好处是“sizeof”运算符将返回“sz”初始值的副本。
上述函数的示例用法:
int main()
{
size_t sz = 3;
int arr[sz];
func(sizeof(arr) / sizeof(int), &arr);
func_1(sizeof(arr) / sizeof(int), &arr);
return 0;
}
为什么不能隐式分配指向 VLA 参数的指针的大小?这至少可以很好地利用语法:
void func(int (*parr)[*]) // size copied from function argument
{
printf("%lu", sizeof(*parr) / sizeof(int));
printf("%lu", sz);
}
然后像这样调用函数:
int main()
{
size_t sz = 3;
int arr[sz];
func(&arr);
return 0;
}
将导致值为“3”的数组隐藏大小变量作为隐藏参数传递给“func”,创建类似于使用当前语法实例化先前的“func”并使用“sizeof”运算符传递数组的代码。
如果你足够好奇将建议的语法编译到任何 Clang 编译器中 - 你会得到一个复活节彩蛋 (;.
【问题讨论】:
-
没有任何“隐藏变量”。
sizeof在编译时计算。见stackoverflow.com/questions/2615203/… -
对不起,但这种情况不同。这不是普通类型,而是 VA 类型。
-
我会在你编辑后再说一遍。调用
func(&arr);将不知道有多少数组元素,甚至不知道它是数组还是单个值。没有隐藏大小,它只是一个指针。 -
但是 'sizeof(arr)' 可以。在“VA”的情况下,主要是通过隐藏变量来实现它。我闻到你不知道类型系统是什么。
-
我现在会停止评论,希望能遇到一些受过良好教育的 C 程序员(他们已经阅读了 ISO 标准 - 最好的)。
标签: c language-lawyer c11