struct People_
{
int age ;
char name[0] ;
} ;
typedef struct People_ People ;
struct X_
{
int i ;
char *p[0];
} ;
typedef struct X_ X ;
struct Y_
{
int i ;
char *p[1];
} ;
typedef struct Y_ Y ;
int main()
{
People* p1 ;
People* p2 ;
printf("(%d)\n",sizeof(People)) ;
printf("(%d)\n",sizeof(X)) ;
printf("(%d)\n",sizeof(Y)) ;
char name1[] = "Mars Chen" ;
char name2[] = "This is a very long name that I have" ;
p1 = (People*) malloc(sizeof(int) + sizeof(char) * (strlen(name1) + 1) ) ;
p2 = (People*) malloc(sizeof(int) + sizeof(char) * (strlen(name2) + 1) ) ;
p1->age = 10 ;
strcpy(p1->name,name1) ;
p2->age = 20 ;
strcpy(p2->name,name2) ;
printf("(%d)(%s)\n",p1->age,p1->name) ;
printf("(%d)(%s)\n",p2->age,p2->name) ;
free(p1) ;
free(p2) ;
}
注意這邊的 name[0] 一定放在 struct 的最後一個欄完 !! 否則 struct hack 無法正常使用 !!!
(4)
(8)
(16)
(10)(Mars Chen)
(20)(This is a very long name that I have)
sizeof(X) 為什麼是 8 不是 4 ? 因為 char *p[0] 的確不佔空間 , 但是 一旦你作 malloc(sizeof(X) + ...) 時 ,
你的指標陣列從 4 開始的話 , 你的 memory alignment 就出問題啦,指標是 8 個 bytes , 你得讓它 aligned(8) 才可以正常使用,
所以 , 為避免這問題 , sizeof(X) = 8 , 讓第一個指標陣列的記憶體可以從 8 倍數開始 !!!
sizeof(Y) = 16 就不解釋了.....
另一個常用的地方是在 skip list :
typedef struct nodeTag {
keyType key; /* key used for searching */
recType rec; /* user data */
struct nodeTag *forward[1]; /* skip list forward pointer */
} nodeType;
/* implementation independent declarations */
typedef struct {
nodeType *hdr; /* list Header */
int listLevel; /* current level of list */
} SkipList;
SkipList list; /* skip list information */
nodeType *x;
x = malloc(sizeof(nodeType) + newLevel*sizeof(nodeType *)
這邊的 最後一個欄位是指標陣列 !!! struct nodeTag* forward[1] , 所以 malloc(sizeof(nodeType)
已經將 一個 forward[0] 指標 給加進去了 !! 如果 skip list 要再加 十層 , 那 newLevel = 10 ,
等於就是 *forward[11] 在此結構裡 ....
留言列表