带有空初始值设定项

时间:2017-07-27 14:17:19

标签: c sizeof variable-declaration

我如何理解这一点:

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,因此我不想在不必要的情况下将[]更改为*;

4 个答案:

答案 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;并在需要时分配内存