精華區beta C_and_CPP 關於我們 聯絡資訊
在看 Linux kernel 的資料結構時 常常看到會有這種宣告方式 例如 char entries[0] 這樣的宣告方法 看起來可能像 label: 這樣的作用 因為取 sizeof 它並不占空間 可以請問前輩們 它算是一個定位作用嗎?(位移、偏移量) 如果是 那該怎麼使用呢? 謝謝解答 -- 西 ╮╭ ── ││ ___ ╭╮ http://fantasymew.pixnet.net/blog ╰╯ ││ ── ╰╯╰╯ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.72.217 > -------------------------------------------------------------------------- < 作者: LPH66 ((short)(-15074)) 看板: C_and_CPP 標題: Re: [問題] 陣列空元素 時間: Wed Aug 19 20:53:33 2009 ※ 引述《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
> -------------------------------------------------------------------------- < 作者: fantasymew (小孫) 看板: C_and_CPP 標題: Re: [問題] 陣列空元素 時間: Thu Aug 20 14:31:33 2009 謝謝 L 大的講解 http://myweb.ncku.edu.tw/~q36984024/iptables1.bmp http://myweb.ncku.edu.tw/~q36984024/iptables2.bmp 的確我在看的這個資料結構,它長度不定 因此在 ipt_entry 裡面是有個欄位如 target_offset 和 next_offset 分別指明資料結構的長度 非常感謝 L 大的講解 QQ ※ 引述《LPH66 ((short)(-15074))》之銘言: : ※ 引述《fantasymew (小孫)》之銘言: : : 在看 Linux kernel 的資料結構時 : : 常常看到會有這種宣告方式 : : 例如 char entries[0] 這樣的宣告方法 : : 看起來可能像 label: 這樣的作用 : : 因為取 sizeof 它並不占空間 : : 可以請問前輩們 : : 它算是一個定位作用嗎?(位移、偏移量) : : 如果是 : : 那該怎麼使用呢? : : 謝謝解答 : 通常這代表這個結構後面會接一個不定長度的東西 : 在結構中應該會有一個欄位指明這東西有多長 : 然後實際在配置空間時就會 : ptr = malloc(sizeof(TheStructure)+AdditionalBytes); : 這樣那個宣告為 [0] 的那個陣列就會正好放在多配置出來的這塊地方 -- 西 ╮╭ ── ││ ___ ╭╮ http://fantasymew.pixnet.net/blog ╰╯ ││ ── ╰╯╰╯ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.72.217
marcX:上層ap與driver溝通常常會遇到類似的struct因為system buffe 08/20 14:39
marcX:e常常會append在後頭。 08/20 14:39
> -------------------------------------------------------------------------- < 作者: su31o4gj83 (哈哈哈哈哈哈哈哈哈哈哈) 看板: C_and_CPP 標題: Re: [問題] 陣列空元素 時間: Thu Aug 20 16:57:12 2009 因為看到 tinlans 大的推文 所以在網路上爬了一些文後, 做了一個小測試 發現的確是可行的, 雖然沒辦法做 sizeof (註解處, 用 char data[0] 可以做 sizeof, 這部分我覺得可以接受) 我猜想 char data[] 應該也不佔記憶體 !! #include <stdio.h> typedef struct{ int head; int size; char reply; char data[]; }packet; int main(){ packet *cmd = malloc(sizeof(packet) + 20); printf("%p\n", cmd); printf("%p\n", cmd->data); // printf("%d\n", sizeof(cmd->data) ); printf("%d\n", sizeof(packet) ); free(cmd); getchar(); return 0; } 另外有個小問題 (網路上看到的) 就是為什麼 sizeof(packet) 是 12 ? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.209.20.225
yearnway:我想應該是前兩個int各佔4,後兩個char各1,可是struct 08/20 17:06
yearnway:會自動把大小補成4的倍數~~所以一共12bytes 08/20 17:07
adrianshum:google struct alignment. 樓上: 不止是補成倍數吧 08/20 17:13
adrianshum:我記得 alignment 是連中間也會有空了位置 08/20 17:14
VictorTom:沒記錯的話, struct尾的alignment是會對齊struct中size 08/20 18:32
VictorTom:最大的那個, 也就是如果例子裡有個double, 應該會發現它 08/20 18:32
VictorTom:align為8的倍數; struct中間的話, 記得是align到接著的 08/20 18:40
VictorTom:這個type, 也就是假設有個member是short s;那s會align到 08/20 18:41
VictorTom:2的倍數. 以上, 純粹就印象說的....@_@" 08/20 18:41
VictorTom:PS. alignment可以設定關掉....:) 08/20 18:43
akasan:幫補充一下 要怎麼align是看compiler實作 08/20 20:17
johnhmj:packet* cmd = (packet*) malloc(...); 08/20 20:18
VictorTom:也對, VC也能硬設對齊多少, 忘了寫清楚....Orz 08/20 20:19
johnhmj:用visual studio IDE 的除錯監看視窗查看結構。 08/20 20:22
su31o4gj83:原來如此啊, 謝謝各位的回覆 08/20 21:04