#includeint main(int argc,char **argv)
;unsigned char a1[10] =;
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;
上面結構體sizeof(struct node)=16,這是在32位系統中。為什麼下面給大家講解一下。
char b,只是佔乙個位元組,但是int b是4個位元組。需要對齊,所以char b也佔四個位元組,short佔兩個位元組,那是不是應該就是10個位元組了,答案是錯誤的。滿足原則三所以位元組是12. 看下面這個例子。
struct node;
這個很簡單了吧,我電腦是64位系統,struct node *next;是乙個位址佔8位,前面是10位,但是要滿足結構體對齊,所以位元組數應該是24位。不懂得繼續追問。
如果我們想按一位元組對齊或者2位元組對齊等,我們可以採取如下措施。
#pragma pack(push) //儲存對齊狀態
#pragma pack(4)//設定為4位元組對齊
#pragma pack(pop)//恢復對齊狀態
sizeof與strlen區別及用法
1.1 你可以把操作符理解為內建的,最基礎的函式,它們無法完全被若干個未使用同型別操作符的函式所替代。比如加法運算子,你就不可能寫出乙個不用 或 的函式來實現任何情況下的加法功能。1.2 運算子 是操作符的一種 和函式還有乙個重要區別。函式本身有一段 程式執行時,遇到函式時,會先將函式的引數入棧,再...
sizeof與strlen的用法與區別
在進入正題之前,我們來先看一段 include include int main int argc,char argv 程式執行得到結果是strlen a 2,sizeof a 10 這是怎麼回事呢?原因是strlen是有效字串的長度,不包含 0 與初始化有關係,沒有初始化strlen的結果是不確定...
關於sizeof與strlen用法的討論
今天在進行乙個多執行緒檔案傳輸的時候,在考慮到收發資料報的組成與拆包時,總是發現收發包會出現錯誤,導致收發報的失敗。後來通過仔細檢查,原來是 sizeof與strlen用法出現了錯誤,經過查詢,我把資料拿出來和大家一起分享。1.sizeof操作符的結果型別是size t,它在標頭檔案中typedef...