空數組我怎樣理解這一點:空初始化
我的編譯器抱怨:錯誤:使用GNU空初始化擴展。 gcc和Clang可以編譯並運行它。語法與double pert[]
有什麼不同?或double *pert
;
在這個例子中,per
t甚至沒有[0],那麼pert[0]
怎麼可能有意義呢?是的,我想這跟sizeof(double)
一樣。
特別是,我分析的代碼在陣列上使用了很多sizeof
,所以我不想將[]
更改爲*
不必要的;
空數組我怎樣理解這一點:空初始化
我的編譯器抱怨:錯誤:使用GNU空初始化擴展。 gcc和Clang可以編譯並運行它。語法與double pert[]
有什麼不同?或double *pert
;
在這個例子中,per
t甚至沒有[0],那麼pert[0]
怎麼可能有意義呢?是的,我想這跟sizeof(double)
一樣。
特別是,我分析的代碼在陣列上使用了很多sizeof
,所以我不想將[]
更改爲*
不必要的;
sizeof
沒有什麼要檢查,因爲數組被錯誤地聲明。你需要用C聲明數組的大小,或者在數組中有元素。您不能有沒有大小的空數組聲明。
嘗試double pert[128];
創建一個名爲「pert」的雙數組,128點。
語法double *
創建指針指向double
。這可以指向數組元素或單個變量。
相比之下,聲明數組時必須至少有一個元素,並且必須知道它的大小。像這樣的初始化的定義:
double pert[] = { 4.5, 6,7 };
是允許的,因爲陣列的大小可以從在初始化元件的數量來推斷,並且該尺寸大於0
double pert[] = {};
這是一個非法操作,不會編譯。
使用指針代替double *pert;
和需要
是的,我知道,我只是想明白爲什麼這樣做,它實際上做了什麼,所以我可以用有效的代碼替換它而不會破壞任何東西。 – dargaud
double pert[] = {};
當分配內存是有點追趕22箱子,陣列被認爲必須有大小定義或它將從初始化列表被termined的至少一種元素,但是你使用了空的初始化器列表,這個列表在標準C中不受支持,並且來自C++,它將初始化數組成員爲0. Gcc會將它視爲一個元素的數組,我認爲。
表達式pert[anything]
相當於*(pert + anything)
。其實你可以寫0[pert]
。只要[]的兩個參數的summ是一個可解引用的指針,那將是合法的代碼(您將被代碼審查小組釘死)。
要解決這個問題,pert不是指針,它是數組的名稱,可能會惡化爲指向數組元素類型的指針,如果在需要指針的表達式中使用。所以如果你將數組作爲指針傳遞,你將失去關於數組大小和sizeof的信息將不起作用
那麼,Func()(它的代碼我沒有)如何利用pert?傳遞的大小是0,它不能放大和返回數組內的任何東西,可以嗎? – dargaud
@dargaud對不起,你不能在C或C++中放大數組!這是c和C++的abc。你必須使用一個容器(最好),例如std :: vector在C++中,或者在c中使用分配的動態對象,通過malloc獲取內存。你聲明的是一個靜態數組,它的大小不能改變。要調整分配的內存大小,請使用realloc。你必須保存並傳遞分配的內存大小 – Swift
是的,所以我的猜測是該行只是一個佔位符:此刻不做任何事情,但可以通過添加到初始化程序來更改函數行爲。我會盡力得到這個確認。謝謝。 – dargaud
你不能在標準C中創建空數組。'double * pert;'是一個指針... –
這就是無效的C,來自編譯器的消息不能更清楚。如果數組和指針是相同的,它們都被稱爲「數組」或「指針」。 – Olaf