1. 程式人生 > >關於結構體地址與結構體指針的一些分析

關於結構體地址與結構體指針的一些分析

add 指針 image src main 包含 res 一點 ima

 當我在學習C語言的鏈表實現時,遇到了一些問題,通常鏈表的表頭是通過結構體創建的,而表頭中包含所需要指向的第一個節點與整個鏈表長度等信息,對於在表頭中所存儲的地址信息感到一點疑惑。
如一下創建的一個單向鏈表:

typedef struct _tag_LinkListNode LinkListNode;       //結點取別名

struct _tag_LinkListNode
{
    LinkListNode* next;
};       // 結點指針域定義      

typedef struct _tag_LinkList
{
    LinkListNode header;
    int length;
} TLinkList;        //頭結點定義

struct Value
{
    LinkListNode header;
    int v;
};           //數據域定義

此時有如下問題:
1.TLinkList中的header存儲的是什麽?
2.TLinkList的長度是多大?
3.TLinkList的鏈表與第一個結點是如何關聯的?

void main(void)
{
    struct  Value v1;
    v1.v = 1;

    TLinkList* list = (TLinkList*)malloc(sizeof(TLinkList));    //創建鏈表
    LinkListNode* current = (LinkListNode*)list;             //將鏈表強制類型轉換

    printf("list size is %d\n",sizeof(list));
    printf("&list address is %p\n", &list);                      
    printf("list address is %p\n", list);
    printf("&(list->header) address is %p\n", &(list->header));

    printf("TLinkList size is %d\n", sizeof(TLinkList));
    printf("list->header value is %p\n",list->header);
    printf("&v1 address is %p\n", &v1);
    printf("&(v1->header) address is %p\n", &(v1.header));
    printf("&(list->length) address is %p\n", &(list->length));
    printf("list length value is %d\n", list->length);
    free(list);
}

其輸出結果為;

list size is 4
&list address is 0113FBE8
list address is 014CF558
&(list->header) address is 014CF558
TLinkList size is 8
list->header value is 0113FBF4
&v1 address is 0113FBF4
&(v1->header) address is 0113FBF4
&(list->length) address is 014CF55C
list length value is 0

根據輸出結果,知道header中存儲的為其指向結點的地址,TLinkList的長度為8,其地址可以用下圖表示:
技術分享圖片

關於結構體地址與結構體指針的一些分析