Re: [問題] 陣列空元素

看板C_and_CPP (C/C++)作者 (哈哈哈哈哈哈哈哈哈哈哈)時間16年前 (2009/08/20 16:57), 編輯推噓2(2013)
留言15則, 6人參與, 最新討論串4/4 (看更多)
因為看到 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

08/20 17:06, , 1F
我想應該是前兩個int各佔4,後兩個char各1,可是struct
08/20 17:06, 1F

08/20 17:07, , 2F
會自動把大小補成4的倍數~~所以一共12bytes
08/20 17:07, 2F

08/20 17:13, , 3F
google struct alignment. 樓上: 不止是補成倍數吧
08/20 17:13, 3F

08/20 17:14, , 4F
我記得 alignment 是連中間也會有空了位置
08/20 17:14, 4F

08/20 18:32, , 5F
沒記錯的話, struct尾的alignment是會對齊struct中size
08/20 18:32, 5F

08/20 18:32, , 6F
最大的那個, 也就是如果例子裡有個double, 應該會發現它
08/20 18:32, 6F

08/20 18:40, , 7F
align為8的倍數; struct中間的話, 記得是align到接著的
08/20 18:40, 7F

08/20 18:41, , 8F
這個type, 也就是假設有個member是short s;那s會align到
08/20 18:41, 8F

08/20 18:41, , 9F
2的倍數. 以上, 純粹就印象說的....@_@"
08/20 18:41, 9F

08/20 18:43, , 10F
PS. alignment可以設定關掉....:)
08/20 18:43, 10F

08/20 20:17, , 11F
幫補充一下 要怎麼align是看compiler實作
08/20 20:17, 11F

08/20 20:18, , 12F
packet* cmd = (packet*) malloc(...);
08/20 20:18, 12F

08/20 20:19, , 13F
也對, VC也能硬設對齊多少, 忘了寫清楚....Orz
08/20 20:19, 13F

08/20 20:22, , 14F
用visual studio IDE 的除錯監看視窗查看結構。
08/20 20:22, 14F

08/20 21:04, , 15F
原來如此啊, 謝謝各位的回覆
08/20 21:04, 15F
文章代碼(AID): #1AZG_fLw (C_and_CPP)
文章代碼(AID): #1AZG_fLw (C_and_CPP)