看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《fantasymew (小孫)》之銘言: : 在看 Linux kernel 的資料結構時 : 常常看到會有這種宣告方式 : 例如 char entries[0] 這樣的宣告方法 : 看起來可能像 label: 這樣的作用 : 因為取 sizeof 它並不占空間 : 可以請問前輩們 : 它算是一個定位作用嗎?(位移、偏移量) : 如果是 : 那該怎麼使用呢? : 謝謝解答 通常這代表這個結構後面會接一個不定長度的東西 在結構中應該會有一個欄位指明這東西有多長 然後實際在配置空間時就會 ptr = malloc(sizeof(TheStructure)+AdditionalBytes); 這樣那個宣告為 [0] 的那個陣列就會正好放在多配置出來的這塊地方 -- 'Oh, Harry, dont't you see?' Hermione breathed. 'If she could have done one thing to make absolutely sure that every single person in this school will read your interview, it was banning it!' ---'Harry Potter and the order of the phoenix', P513 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.84
hilorrk:但是已宣告的array不能用動態配置吧? 08/19 20:57
james732:這種用法在C++似乎行不通了? 08/19 21:01
VictorTom:它不是針對array[0]重新做動態配置, 而是那個array[0]的 08/19 21:15
VictorTom:宣告會放struct head的最後, 直接相當於銜接struct data 08/19 21:15
VictorTom:的頭; 不另外用void*或char*的好處事它不用佔用空間:) 08/19 21:16
james732:咦 所以char*會佔一個指標的空間 但是char[0]不會? 08/19 21:16
VictorTom:是的:) 小弟隨手用DevC++測, 應該C++還是可以用的喔.... 08/19 21:19
VictorTom:那個array[0]認知上要當作它是定位/位移用的也OK吧我想. 08/19 21:19
VictorTom:印象中常用的地方像網路封包, 用法就像回文的L大寫的那 08/19 21:22
VictorTom:樣, 在AdditionalBytes的範圍內, 可以直接用array[N] :) 08/19 21:22
littleshan:C++ 標準規定陣列大小必須大於零 08/20 02:03
littleshan:g++ 加上 -pedantic 參數後就會報錯了 08/20 02:05
VictorTom:原來如此, 謝謝l大:) 08/20 02:41
ledia:其實也有一些是放 char[1] 的 08/20 14:00
su31o4gj83:不太懂為什麼會需要用到這種技巧 @@ 08/20 14:07
VictorTom:方便吧, 而且掛pointer的話還得分兩次malloc空間XD 08/20 14:10
ledia:避免 shallow copy 的問題 ? i guess 08/20 14:10
VictorTom:一直都不知道shallow/deep copy這組術語....Orz 08/20 14:13
tinlans:C99 新的寫法已經可以直接留空了,寫 [] 表示它是彈性陣列 08/20 14:56
tinlans:,但限制就是它必須是最後一個 data member。 08/20 14:57
Favonia:#1E1snMFF 07/23 19:51