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)//恢復對齊狀態