为什么我可以在C中的函数参数的数组声明中编写表达式



为什么以下代码编译时没有警告或错误?

#include <stdlib.h>
#include <string.h>
#ifdef __GNUC__
__attribute__((__const__))
#endif
int len(char** array) {
int i;
for (i = 0; array[i]; i++);
return i;
}
void inner_len(char** array, int out[len(array)]) {
int i;
for (i = 0; i < len(array); i++) {
out[i] = strlen(array[i]);
}
}
int main() {
char* array[] = {
"hello",
"world",
NULL
};
int ilen[1];
inner_len(array, ilen);
}

尤其是inner_len的函数声明是我最困惑的地方。我看到gcc为错误的数组长度提供了警告。函数声明中的表达式是否被忽略?

您在这里所做的是声明一个可变长度数组。如果你把它编译成ISOC89,你会得到:

$ gcc --std c89 -pedantic -Wall bla.c
bla.c:9:1: warning: ISO C90 forbids variable length array ‘out’ [-Wvla]
9 | void inner_len(char** array, int out[len(array)]) {
| ^~~~

但由于C99没有警告,因为ISO C99添加了可变长度阵列,例如。,https://en.wikipedia.org/wiki/Variable-length_array#C99.

请注意,out仍然是一个普通的指针,通常在C中,当您将数组作为参数传递给函数时。这里也没有编译时间长度检查,因为编译器在函数len()中运行/评估代码,而不是在使用类似int out[2]的文字时。

最新更新