close

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]  在此結構裡  ....

 

 

 

arrow
arrow
    全站熱搜

    hedgezzz 發表在 痞客邦 留言(1) 人氣()