我如何理解这一点:
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
,因此我不想在不必要的情况下将[]
更改为*
;
答案 0 :(得分:1)
double pert[] = {};
有点catch-22的情况,数组应该至少有一个元素有大小定义,或者它将从初始化列表中定义,但是你使用空的初始化列表,这在标准中是不支持的C和来自C ++,它会将声明的数组成员初始化为0.我认为Gcc会将它视为一个元素的数组。
表达式pert[anything]
相当于*(pert + anything)
。实际上你可以写0[pert]
。只要[]的两个参数的总和是一个可解除引用的指针,那就是合法代码(代码审查小组会将你钉在十字架上)。
为了清理,pert不是指针,它是可以恶化为指向一种数组元素的指针的数组的名称,如果在需要指针的表达式中使用的话。因此,如果您将数组作为指针传递,您将丢失有关数组大小和sizeof的信息将无法正常工作
答案 1 :(得分:0)
sizeof
没有任何要检查的东西。您需要在C中声明数组的大小,或者在数组中包含元素。你不能有一个没有大小的空数组声明。
尝试double pert[128];
创建一个名为" pert"的双数组。有128个点。
答案 2 :(得分:0)
语法double *
创建指向double
的指针。这可以指向数组元素或单个变量。
相反,当声明一个数组时,它必须至少有一个元素,并且必须知道它的大小。使用这样的初始化程序的定义:
double pert[] = { 4.5, 6,7 };
是否允许,因为数组的大小可以从初始化程序中的元素数量推断出来,并且该大小大于0。
答案 3 :(得分:0)
double pert[] = {};
这是非法操作,不会编译。
使用指针代替double *pert;
并在需要时分配内存