C語言之 sizeof 和strlen 函式

2021-09-26 10:11:15 字數 1698 閱讀 4352

sizeof 既是乙個關鍵字,還是乙個運算子。而不是乙個函式。sizeof的作用週期是編譯階段。

sizeof的作用是用來返回()裡面物件占用的記憶體位元組數。其計算物件型別可以為

資料型別、變數、函式、陣列、指標等

ref:

strlen是乙個c庫函式(string.h),用來返回乙個字串的長度(注意,字串的長度是不計算字串末尾的'\0'的,c語言會自動在在雙引號""括起來的內容的末尾補上"\0"代表結束)。

一定要注意strlen接收的引數必須是乙個字串(字串的特徵是以'\0'結尾)

『\0』是字串結束標誌位 對應ascii 碼:00;,所以要注意如下**:

uint8_t uart1_rxbuffer[100];

uart1_rxbuffer[0] = 0xa5;

uart1_rxbuffer[1] = 0x52;

uart1_rxbuffer[2] = 0x00;//『\0』

uart1_rxbuffer[3] = 0x02;

uart1_rxbuffer[4] = 0x02;

uart1_rxbuffer[5] = 0xf8;

//printf("strlen:%d\r\n",strlen(uart1_rxbuffer));//實際輸出結果是2

printf("%s",uart1_rxbuffer);//實際上只能列印0xa5和0x52;

函式原型:

size_t strlen(const char *str)
注意返回值為size_t型別,size_t是一些c/c++標準在stddef.h中定義的,它是乙個與機器相關的unsigned型別。

在32位架構中被普遍定義為:

typedef   unsigned int size_t;

而在64位架構中被定義為:

typedef  unsigned long size_t;

char sarr = "ilovec";

/*用strlen()求長度*/

printf("sarr的長度=%d\n", strlen(sarr));//執行結果為 6(因為不包括結束字元 null)

sizeof(int),sizeof(long)等,不同編譯器得到的結果可能是不同的。

int i = 1;sizeof(i);//sizeof測試乙個變數本身,和sizeof測試這個變數的型別,結果是一樣的。

當sizeof的物件是陣列名時,即sizeof(陣列名)實際返回的是整個陣列所占用記憶體空間(以位元組為單位的)

char a = "abcdef";

char b = ;

int c[20] = ;

cout《其他情況的陣列名一律視為首元素的位址。

cout << sizeof(*a) << endl;//1 a代表首元素的位址,*a就代表首元素,用在這裡也就是求取首元素的資料型別

cout << sizeof(*b) << endl;//1

cout << sizeof(*c) << endl;//4

當sizeof的物件是指標時,不管是什麼型別的指標,大小都是固定的,和執行環境相關。

cout

C 錯誤知識點梳理之sizeof和strlen

sizeof 是以分類的陣列的實際所佔的記憶體空間大小計算長度 strlen計算字串的長度,是以 0 為字串結束標誌。const char str 123456 sizeof str 和strlen str 的結果分別是 第乙個sizeof讀取的是指標的長度,在64位系統為8b 在32位系統為4b ...

C 和C語言之爭

剛才在csdn首頁看了一篇linux之父攻擊c 的文章,以及國內資深技術人員的看法。我目前正在向c 轉型,並在我們公司推廣c 這些討論中倒是有很多可以學習的東西。這裡整理一下我的思路。1 語言的選擇是乙個信仰問題。這句話理解不透。目前理解為個人喜歡,習慣。2 脫離實際的應用談論語言沒有意義。每個語言...

C語言的sizeof和strlen

strlen是函式,而sizeof是算符。strlen需要進行一次函式呼叫,而對於sizeof而言,因為緩衝區已經用已知字串進行了初始化,其長度是固定的,所以sizeof在編譯時計算緩衝區的長度。strlen是遇到0或者 0 都會停止運算的,而sizeof是每個字元都會算的,不會漏掉0 或者 0 因...