根据GNU关于可变长度数组的文档,可以使用sizeof运算符来确定传递给函数的可变长度数组的大小:
您还可以使用可变长度数组作为函数的参数:
Run Code Online (Sandbox Code Playgroud)struct entry tester (int len, char data[len][len]) { /* … */ }分配存储时计算一次数组的长度,并在您访问数组时记住该数组的范围
sizeof.
但是,当使用下面的完整代码示例尝试此示例时,sizeof运算符将返回指针的大小,而不是基于上面的GNU代码段所预期的分配的vla的大小.
我知道在C中传递数组类似于将指针传递给数组的第一个元素,但由于我们在函数签名中指定了这种情况下的大小,我希望在使用sizeof范围时我可以模仿行为.声明数组的位置.
我也意识到我可以使用这个len参数来计算出尺寸; 但为了方便和理解GNU的实现,我仍然认为这是一个有趣的(如果不是很重要的)问题.
提前感谢任何能够深入了解此事的人!
// file: vla.c
#include <stdio.h>
void foo(int len, char data[len][len]) {
printf("sizeof \"foo\" data: %lu\n", sizeof(data));
}
int main(int argc, char * argv[]) {
char data[argc][argc];
printf("sizeof \"main\" data: %lu\n", sizeof(data));
foo(argc, data);
}
Run Code Online (Sandbox Code Playgroud)
编译使用:
gcc vla.c -o vla -std=c11
Run Code Online (Sandbox Code Playgroud)
叫做使用:
./vla 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
输出:
sizeof …Run Code Online (Sandbox Code Playgroud)