C语言 sizeof 和 strlen 函数区别 - C语言零基础入门教程
目錄
- 一.sizeof 函數(shù)與 strlen 函數(shù)區(qū)別
- 1.獲取字符串長(zhǎng)度 – 針對(duì)字符串
- 2.獲取指針/數(shù)組長(zhǎng)度 – 針對(duì)指針/數(shù)組
- 3.sizeof 獲取內(nèi)存大小
- 4.經(jīng)典案例
- 二.猜你喜歡
零基礎(chǔ) C/C++ 學(xué)習(xí)路線推薦 :?C/C++ 學(xué)習(xí)目錄?>>?C 語言基礎(chǔ)入門
一.sizeof 函數(shù)與 strlen 函數(shù)區(qū)別
在C 語言中,strlen 函數(shù)和 sizeof 函數(shù)都能獲取字符串長(zhǎng)度,但是兩者之間到底有什么區(qū)別呢,下面我們一一道來;
1.獲取字符串長(zhǎng)度 – 針對(duì)字符串
sizeof 函數(shù)數(shù)獲取的長(zhǎng)度是整個(gè)內(nèi)存大小的長(zhǎng)度,返回的長(zhǎng)度包括'\0';strlen 函數(shù)獲取的長(zhǎng)度以'\0'結(jié)尾,返回的長(zhǎng)度不包括'\0';
a.獲取常規(guī)字符串長(zhǎng)度 – 使用 strlen 和 sizeof 都一樣
/******************************************************************************************/ //@Author:猿說編程 //@Blog(個(gè)人博客地址): www.codersrc.com //@File:C語言教程 - C語言 sizeof 和 strlen 函數(shù)區(qū)別 //@Time:2021/06/03 07:40 //@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! /******************************************************************************************/char p[4] = "abc"; printf("字符串:%s sizeof長(zhǎng)度:%d\n", p, sizeof(p)); printf("字符串:%s strlen長(zhǎng)度:%d\n", p, strlen(p)); /* 輸出:字符串:abc sizeof長(zhǎng)度:4 字符串:abc strlen長(zhǎng)度:3 */sizeof 求的是字符串在內(nèi)存中的長(zhǎng)度,所以它是加上最后的 '\0' 的,所以一般而言 sizeof 函數(shù)的長(zhǎng)度會(huì)比 strlen 函數(shù)的長(zhǎng)度多 1。
b.獲取非常規(guī)字符串長(zhǎng)度 – 使用 strlen 和 sizeof 不一樣
/******************************************************************************************/ //@Author:猿說編程 //@Blog(個(gè)人博客地址): www.codersrc.com //@File:C語言教程 - C語言 sizeof 和 strlen 函數(shù)區(qū)別 //@Time:2021/06/03 07:40 //@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! /******************************************************************************************/char str[1char str[100] = {0}; strcpy(str, "abcd"); int str_len = strlen(str); int str_size = sizeof(str); printf("strlen(str) = %d\n", (str_len)); printf("sizeof(str) = %d\n", (str_size)); /* 輸出:strlen(str) = 4 sizeof(str) = 100 */這個(gè)例子可以充分說明:strlen 計(jì)算的是字符串到'\0'位置的大小,sizeof 計(jì)算的字符串占的內(nèi)存大小,這也是 strlen 函數(shù)和 [sizeof](https://www.codersrc.com/archives/7851.html) 不同之處;
2.獲取指針/數(shù)組長(zhǎng)度 – 針對(duì)指針/數(shù)組
/******************************************************************************************/ //@Author:猿說編程 //@Blog(個(gè)人博客地址): www.codersrc.com //@File:C語言教程 - C語言 sizeof 和 strlen 函數(shù)區(qū)別 //@Time:2021/06/03 07:40 //@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! /******************************************************************************************/char p1[] = "abcdefg"; //數(shù)組 printf("字符串:%s sizeof長(zhǎng)度:%d\n", p1, sizeof(p1)); printf("字符串:%s strlen長(zhǎng)度:%d\n", p1, strlen(p1)); printf("----------------------------\n"); char* p2 = "abcdefg"; //指針 printf("字符串:%s sizeof長(zhǎng)度:%d\n", p2, strlen(p2)); printf("字符串:%s strlen長(zhǎng)度:%d\n", p2, sizeof(p2)); /*輸出:字符串:abcdefg sizeof長(zhǎng)度:8 字符串:abcdefg strlen長(zhǎng)度:7 ---------------------------- 字符串:abcdefg sizeof長(zhǎng)度:7 字符串:abcdefg strlen長(zhǎng)度:4*/值得注意的是:指針占用的內(nèi)存大小始終為 4 個(gè)字節(jié);
3.sizeof 獲取內(nèi)存大小
strlen 函數(shù)只能計(jì)算字符串長(zhǎng)度,sizeof能獲取 int / float / bool / char 等等所有類型的內(nèi)存占用大小,比如:
/******************************************************************************************/ //@Author:猿說編程 //@Blog(個(gè)人博客地址): www.codersrc.com //@File:C語言教程 - C語言 sizeof 和 strlen 函數(shù)區(qū)別 //@Time:2021/06/03 07:40 //@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! /******************************************************************************************/printf("int=%d\nshort=%d\ndouble=%d\n", sizeof(int), sizeof(short), sizeof(double)); /* 輸出:int=4 short=2 double=8 請(qǐng)按任意鍵繼續(xù). . . */4.經(jīng)典案例
/******************************************************************************************/ //@Author:猿說編程 //@Blog(個(gè)人博客地址): www.codersrc.com //@File:C語言教程 - C語言 sizeof 和 strlen 函數(shù)區(qū)別 //@Time:2021/06/03 07:40 //@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! /******************************************************************************************/#include "stdafx.h" #include<stdlib.h> #include<stdio.h> void main() {int arr[] = { 1, 2, 3 };printf("sizeof(arr) : %d\n",sizeof(arr));for (int i = 0; i < sizeof(arr); i++){printf("%d,", arr[i]);}printf("\n");system("pause"); } /* 輸出結(jié)果:sizeof(arr) : 12 1,2,3,-858993460,9697168,11737625,1,13017304,13018680,123799719,11735310,11735310, 請(qǐng)按任意鍵繼續(xù). . . */是不是很懵逼,,除了會(huì)輸出 1,2,3 以外,還會(huì)輸出雜亂無章的數(shù)字,但一共是輸出 12 個(gè)。因?yàn)閿?shù)組的內(nèi)存是動(dòng)態(tài)分配的,到了元素 3 以后的元素都是新分配的,并不一定是空,隨機(jī)數(shù)。
因?yàn)閿?shù)組是一片連續(xù)的空間,有可能元素 3 的空間是有數(shù)據(jù)的,那么 C 語言會(huì)將其讀取出來,當(dāng)然是一些沒有實(shí)際意義的雜亂無章的數(shù)字,但你不要想著去操作,否則可能導(dǎo)致數(shù)據(jù)錯(cuò)亂,所以有可能你運(yùn)行好幾次,后面的值都不會(huì)有變化。正確版本如下:
/******************************************************************************************/ //@Author:猿說編程 //@Blog(個(gè)人博客地址): www.codersrc.com //@File:C語言教程 - C語言 sizeof 和 strlen 函數(shù)區(qū)別 //@Time:2021/06/03 07:40 //@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! /******************************************************************************************/int arr[] = { 1, 2, 3 }; printf("sizeof(arr)/sizeof(int) : %d\n", sizeof(arr) / sizeof(int)); for (int i = 0; i < sizeof(arr) / sizeof(int); i++){printf("%d,", arr[i]); } /* 輸出:sizeof(arr)/sizeof(int) : 3 1,2,3, 請(qǐng)按任意鍵繼續(xù). . . */二.猜你喜歡
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? C 語言 sizeof 和 strlen 函數(shù)區(qū)別
[喜歡(3)](javascript:😉 [打賞](javascript:😉
總結(jié)
以上是生活随笔為你收集整理的C语言 sizeof 和 strlen 函数区别 - C语言零基础入门教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BugkuCTF-MISC题赛博朋克
- 下一篇: 类和对象之总结