我遇到了这段代码,但我真的不知道它是如何/为什么工作的:
void cistore(int bucketsize, int data[][bucketsize])
{
}
int main()
{
return 0;
}
这里到底发生了什么?我希望 C 编译器(在本例中为 gcc)仅bucketsize
在编译时可确定时才允许这样做。但是即使在编译时无法知道bucketsize,gcc 也不会抱怨。gcc 是如何处理的?
这里到底发生了什么?
从 C99 开始,C 就支持变长数组,其长度是在运行时确定的。在 C99 中它是一个强制性特性,但从 C11 开始它成为一个可选特性。许多现代 C 编译器都支持它,微软的除外。
在
void cistore(int bucketsize, int data[][bucketsize])
,data
被声明为指向bucketsize
类型为 的元素数组的指针int
。指向的对象是一个变长数组,至少从函数的角度来看是这样。
我希望 C 编译器(在本例中为 gcc)仅
bucketsize
在编译时可确定时才允许这样做。
惊喜!
但是即使在编译时无法知道bucketsize,gcc 也不会抱怨。gcc 是如何处理的?
如果指向的数组有明确的长度,GCC 将如何处理它?至于“怎么做”,我不认为GCC需要做太多的调整。
或者,如果您问的是语义,那么一旦他们克服了对 VLA 是一回事的任何震惊,它们就几乎是人们所期望的。指向的对象是一个数组,其任何给定函数调用的长度由bucketsize
参数的值指定。这可能因电话而异。
这是示例代码的扩展版本,用于演示:
void cistore(int bucketsize, int data[][bucketsize])
{
}
int main()
{
int d1[5][5];
int d2[4][6];
int (*d3)[42] = NULL;
cistore(5, d1);
cistore(6, d2);
cistore(42, d3);
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句