我该如何理解这一点:
void Func(double* P, long L) {}
int main(void) {
double pert[] = {};
Func(pert, sizeof(pert)/sizeof(pert[0]));
}
我的编译器提示:错误:使用 GNU 空初始值设定项扩展。 gcc和Clang可以正常编译和运行。该语法与 double pert[] 有何不同;或double *pert
;
在这个例子中,per
t甚至没有[0],那么pert[0]
怎么有意义呢?是的,我想它与 sizeof(double)
相同。
特别是,我正在分析的代码在数组上使用了大量 sizeof
,因此我不想将 []
更改为 *
不必要的;
最佳答案
double pert[] = {};
是一种 catch-22 情况,数组应该至少有一个元素已定义大小,否则它将从初始值设定项列表终止,但您使用空初始值设定项列表,这在标准 C 和中不受支持来自 C++,它会将声明的数组成员初始化为 0。我认为,Gcc 会将其视为一个元素的数组。
表达式pert[anything]
相当于*(pert + everything)
。事实上你可以写0[pert]
。只要 [] 的两个参数的和是一个可解引用的指针,那就是合法的代码(为此你会被代码审查小组钉死)。
为了澄清这一点,pert 不是指针,它是数组的名称,如果在需要指针的表达式中使用,则可以恶化为指向数组元素类型的指针。因此,如果将数组作为指针传递,您将丢失有关数组大小的信息,并且 sizeof 将不起作用
关于c - 具有空初始值设定项的空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45353462/