2017-07-27 152 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