看板 C_and_CPP 關於我們 聯絡資訊
因為看到 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