聊點基礎的–sizeof,strlen,數組,字符串在一起能整哪些坑?
- 2019 年 11 月 24 日
- 筆記
來源:公眾號【編程珠璣】
作者:守望先生
ID:shouwangxiansheng
對於初學者來說,sizeof,strlen,數組,字符串整在一起是痛苦的,它總能在某些莫名其妙的時候整一個措手不及。本文看看它們在一起能挖什麼坑。
例子
在說明這些問題之前,先看一段代碼,看看你是否都理解了。(註:以下代碼結果為編譯為64位程序後運行結果)
//來源:公眾號【編程珠璣】 #include <stdio.h> #include <string.h> void testArr(const char str[]) { printf("%lu %lun", sizeof(str), strlen(str)); } int main(void) { /*test 0*/ char str[] = "hello"; printf("test0 %lu %lunn", sizeof(str), strlen(str)); //6 5 /*test 1*/ char str1[8] = "hello"; printf("test1 %lu %lunn", sizeof(str1), strlen(str1)); //8 5 /**test 2*/ char str2[] = {'h','e','l','l','o'}; printf("test2 %lu %lunn", sizeof(str2), strlen(str2)); //5 10 /**test 3*/ char *str3 = "hello"; printf("test3 %lu %lunn", sizeof(str3), strlen(str3)); //8 5 /*test 4*/ char str4[] = "hello"; testArr(str4);//8 5 /*test 5*/ char str5[] = "hell o"; printf("test5 %lu %lun", sizeof(str5), strlen(str5)); //7 4 /*test 6*/ char str6[10] = {0}; printf("test6 %lu %lunn", sizeof(str6), strlen(str6)); //10 0 /*test 7*/ char str7[5] = "hello"; printf("test7 %lu %lunn", sizeof(str7), strlen(str7)); //5 10 /*test 8*/ char str8[5] = {0}; strncpy(str8,"hello",5); printf("%sn",str8);//hellohello return 0; }
特別注意觀察test2和test7。 在解釋這些測試之前,先複習一下sizeof,strlen以及數組的內容。
sizeof
首先需要明確的是,sizeof是操作符,即它並不是函數,它的作用對象是數據類型,因此,它作用於變量時,也是對其類型進行操作。得到的結果是該數據類型佔用空間大小,即size_t類型。 例如:
struct test { int a; char b; }; sizeof(int);//得到4 sizeof(test);//4位元組對齊時,得到8
需要注意的是,它在計算數據類型佔用空間大小時,會考慮位元組對齊,關於位元組對齊,可以參考《理一理位元組對齊的那些事》。 另外sizeof的時間複雜度是O(1)。
strlen
strlen是函數
size_t strlen(const char *s);
它用於計算字符串的長度。它的計算原則是: 從參數s所指向的內存開始往後計數,直到內存中的內容是0(即』 』,參考《NULL,0,'