2017-07-27 184 views
-1

空数组我怎样理解这一点:空初始化

我的编译器抱怨:错误:使用GNU空初始化扩展。 gcc和Clang可以编译并运行它。语法与double pert[]有什么不同?或double *pert;

在这个例子中,per t甚至没有[0],那么pert[0]怎么可能有意义呢?是的,我想这跟sizeof(double)一样。

特别是,我分析的代码在阵列上使用了很多sizeof,所以我不想将[]更改为*不必要的;

+2

你不能在标准C中创建空数组。'double * pert;'是一个指针... –

+1

这就是无效的C,来自编译器的消息不能更清楚。如果数组和指针是相同的,它们都被称为“数组”或“指针”。 – Olaf

回答

0

sizeof没有什么要检查,因为数组被错误地声明。你需要用C声明数组的大小,或者在数组中有元素。您不能有没有大小的空数组声明。

尝试double pert[128];创建一个名为“pert”的双数组,128点。

0

语法double *创建指针指向double。这可以指向数组元素或单个变量。

相比之下,声明数组时必须至少有一个元素,并且必须知道它的大小。像这样的初始化的定义:

double pert[] = { 4.5, 6,7 }; 

是允许的,因为阵列的大小可以从在初始化元件的数量来推断,并且该尺寸大于0

0

double pert[] = {};

这是一个非法操作,不会编译。

使用指针代替double *pert;和需要

+0

是的,我知道,我只是想明白为什么这样做,它实际上做了什么,所以我可以用有效的代码替换它而不会破坏任何东西。 – dargaud

1
double pert[] = {}; 

当分配内存是有点追赶22箱子,阵列被认为必须有大小定义或它将从初始化列表被termined的至少一种元素,但是你使用了空的初始化器列表,这个列表在标准C中不受支持,并且来自C++,它将初始化数组成员为0. Gcc会将它视为一个元素的数组,我认为。

表达式pert[anything]相当于*(pert + anything)。其实你可以写0[pert]。只要[]的两个参数的summ是一个可解引用的指针,那将是合法的代码(您将被代码审查小组钉死)。

要解决这个问题,pert不是指针,它是数组的名称,可能会恶化为指向数组元素类型的指针,如果在需要指针的表达式中使用。所以如果你将数组作为指针传递,你将失去关于数组大小和sizeof的信息将不起作用

+0

那么,Func()(它的代码我没有)如何利用pert?传递的大小是0,它不能放大和返回数组内的任何东西,可以吗? – dargaud

+0

@dargaud对不起,你不能在C或C++中放大数组!这是c和C++的abc。你必须使用一个容器(最好),例如std :: vector在C++中,或者在c中使用分配的动态对象,通过malloc获取内存。你声明的是一个静态数组,它的大小不能改变。要调整分配的内存大小,请使用realloc。你必须保存并传递分配的内存大小 – Swift

+0

是的,所以我的猜测是该行只是一个占位符:此刻不做任何事情,但可以通过添加到初始化程序来更改函数行为。我会尽力得到这个确认。谢谢。 – dargaud