1. 程式人生 > >sizeof與strlen用法詳解(結構體對齊)

sizeof與strlen用法詳解(結構體對齊)

#include<stdio.h>

int main(int argc,char **argv)
{
unsigned char a[10]  ={1,2,1,2,3,4};
unsigned char a1[10] ={0,0,0,0,0,0};
char *p="hello world!";

printf("sizeof(p)  =%d\n",sizeof(p));
printf("strlen(p)  =%d\n",strlen(p));
printf("sizeof(a)  =%d\n",sizeof(a));
printf("sizeof(&a[0]) =%d\n",sizeof(&a[0]));
printf("strlen(a)  =%d\n",strlen(a));
printf("sizeof(a1) =%d\n",sizeof(a1));
printf("strlen(a1) =%d\n",strlen(a1));

return 0;
}

上面這個程式如果家能夠寫出正確結果,我相信不管什麼筆試題。考到這型別的都不會錯了。分32位系統還是64位系統。

對結構體求長度,連結串列求長度在這裡我稍微講解一下。

對齊原則
1.普通資料成員對齊規則:第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍地址開始儲存)。
2.結構體成員對齊規則:如果一個結構裡有某些結構體成員,則該結構體成員要從其內部最大元素大小的整數倍地址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始儲存。)
3.結構體大小對齊規則:結構體大小也就是sizeof的結果,必須是其內部成員中最大的對齊引數的整數倍,不足的要補齊。

struct node{
    char  b;
    int   a;
    short c;
};

上面結構體sizeof(struct node)=16,這是在32位系統中。為什麼下面給大家講解一下。

char   b,只是佔一個位元組,但是int b是4個位元組。需要對齊,所以char b也佔四個位元組,short佔兩個位元組,那是不是應該就是10個位元組了,答案是錯誤的。滿足原則三所以位元組是12. 看下面這個例子。

struct node{
    char  b;
    int   a;
    short c;
    struct node *next;
};

這個很簡單了吧,我電腦是64位系統,struct node *next;是一個地址佔8位,前面是10位,但是要滿足結構體對齊,所以位元組數應該是24位。不懂得繼續追問。

如果我們想按一位元組對齊或者2位元組對齊等,我們可以採取如下措施。

#pragma pack(push) //儲存對齊狀態
#pragma pack(4)//設定為4位元組對齊
#pragma pack(pop)//恢復對齊狀態