推 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